@lynker-desktop/electron-window-manager 0.0.9-alpha.1 → 0.0.9-alpha.11

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/common/index.d.ts CHANGED
@@ -57,5 +57,20 @@ export interface BVItem extends BrowserView {
57
57
  /** 初始化url */
58
58
  _initUrl?: string;
59
59
  }
60
+ /**
61
+ * 预加载配置接口
62
+ */
63
+ export interface PreloadWebContentsConfig {
64
+ /** 预加载的 URL */
65
+ url: string;
66
+ /** 是否预加载普通窗口 */
67
+ enableBW?: boolean;
68
+ /** 是否预加载无边框有按钮的窗口 */
69
+ enableBW_FramelessWithButtons?: boolean;
70
+ /** 是否预加载无边框无按钮的窗口 */
71
+ enableBW_FramelessNoButtons?: boolean;
72
+ /** 是否预加载浏览器视图 */
73
+ enableBV?: boolean;
74
+ }
60
75
  export {};
61
76
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/common/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,+BAA+B,EAAE,6BAA6B,EAAE,MAAM,UAAU,CAAC;AAE3H,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,+BAA+B,EAAE,QAAQ,CAAC;IACxF,MAAM,CAAC,EAAE,MAAM,GAAG,+BAA+B,CAAC,QAAQ,CAAC,CAAC;CAC7D;AAED,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,6BAA6B,EAAE,QAAQ,CAAC;IACpF,MAAM,CAAC,EAAE,MAAM,GAAG,+BAA+B,CAAC,QAAQ,CAAC,CAAC;CAC7D;AAGD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,2BAA2B,CAAC,EAAE,GAAG,CAAC;KACnC;CACF;AAED,MAAM,MAAM,6BAA6B,GACrC,CAAC;IAAE,IAAI,CAAC,EAAE,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,iBAAiB,CAAA;CAAE,GAAG,IAAI,CAAC,iCAAiC,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,GACxH,CAAC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,eAAe,CAAA;CAAE,GAAG,IAAI,CAAC,iCAAiC,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC;AAE1H,UAAU,iCAAiC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE;QACZ,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,SAAS,CAAC,EAAE;QACV,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,aAAa,CAAC,EAAE,iBAAiB,GAAG,eAAe,CAAC;IACpD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,MAAO,SAAQ,aAAa;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa;IACb,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,MAAO,SAAQ,WAAW;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa;IACb,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/common/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,+BAA+B,EAAE,6BAA6B,EAAE,MAAM,UAAU,CAAC;AAE3H,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,+BAA+B,EAAE,QAAQ,CAAC;IACxF,MAAM,CAAC,EAAE,MAAM,GAAG,+BAA+B,CAAC,QAAQ,CAAC,CAAC;CAC7D;AAED,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,6BAA6B,EAAE,QAAQ,CAAC;IACpF,MAAM,CAAC,EAAE,MAAM,GAAG,+BAA+B,CAAC,QAAQ,CAAC,CAAC;CAC7D;AAGD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,2BAA2B,CAAC,EAAE,GAAG,CAAC;KACnC;CACF;AAED,MAAM,MAAM,6BAA6B,GACrC,CAAC;IAAE,IAAI,CAAC,EAAE,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,iBAAiB,CAAA;CAAE,GAAG,IAAI,CAAC,iCAAiC,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,GACxH,CAAC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,eAAe,CAAA;CAAE,GAAG,IAAI,CAAC,iCAAiC,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC;AAE1H,UAAU,iCAAiC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE;QACZ,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,SAAS,CAAC,EAAE;QACV,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,aAAa,CAAC,EAAE,iBAAiB,GAAG,eAAe,CAAC;IACpD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,MAAO,SAAQ,aAAa;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa;IACb,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,MAAO,SAAQ,WAAW;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa;IACb,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,eAAe;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACxC,qBAAqB;IACrB,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,iBAAiB;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB"}
@@ -57,5 +57,20 @@ export interface BVItem extends BrowserView {
57
57
  /** 初始化url */
58
58
  _initUrl?: string;
59
59
  }
60
+ /**
61
+ * 预加载配置接口
62
+ */
63
+ export interface PreloadWebContentsConfig {
64
+ /** 预加载的 URL */
65
+ url: string;
66
+ /** 是否预加载普通窗口 */
67
+ enableBW?: boolean;
68
+ /** 是否预加载无边框有按钮的窗口 */
69
+ enableBW_FramelessWithButtons?: boolean;
70
+ /** 是否预加载无边框无按钮的窗口 */
71
+ enableBW_FramelessNoButtons?: boolean;
72
+ /** 是否预加载浏览器视图 */
73
+ enableBV?: boolean;
74
+ }
60
75
  export {};
61
76
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,+BAA+B,EAAE,6BAA6B,EAAE,MAAM,UAAU,CAAC;AAE3H,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,+BAA+B,EAAE,QAAQ,CAAC;IACxF,MAAM,CAAC,EAAE,MAAM,GAAG,+BAA+B,CAAC,QAAQ,CAAC,CAAC;CAC7D;AAED,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,6BAA6B,EAAE,QAAQ,CAAC;IACpF,MAAM,CAAC,EAAE,MAAM,GAAG,+BAA+B,CAAC,QAAQ,CAAC,CAAC;CAC7D;AAGD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,2BAA2B,CAAC,EAAE,GAAG,CAAC;KACnC;CACF;AAED,MAAM,MAAM,6BAA6B,GACrC,CAAC;IAAE,IAAI,CAAC,EAAE,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,iBAAiB,CAAA;CAAE,GAAG,IAAI,CAAC,iCAAiC,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,GACxH,CAAC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,eAAe,CAAA;CAAE,GAAG,IAAI,CAAC,iCAAiC,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC;AAE1H,UAAU,iCAAiC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE;QACZ,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,SAAS,CAAC,EAAE;QACV,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,aAAa,CAAC,EAAE,iBAAiB,GAAG,eAAe,CAAC;IACpD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,MAAO,SAAQ,aAAa;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa;IACb,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,MAAO,SAAQ,WAAW;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa;IACb,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,+BAA+B,EAAE,6BAA6B,EAAE,MAAM,UAAU,CAAC;AAE3H,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,+BAA+B,EAAE,QAAQ,CAAC;IACxF,MAAM,CAAC,EAAE,MAAM,GAAG,+BAA+B,CAAC,QAAQ,CAAC,CAAC;CAC7D;AAED,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,6BAA6B,EAAE,QAAQ,CAAC;IACpF,MAAM,CAAC,EAAE,MAAM,GAAG,+BAA+B,CAAC,QAAQ,CAAC,CAAC;CAC7D;AAGD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,2BAA2B,CAAC,EAAE,GAAG,CAAC;KACnC;CACF;AAED,MAAM,MAAM,6BAA6B,GACrC,CAAC;IAAE,IAAI,CAAC,EAAE,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,iBAAiB,CAAA;CAAE,GAAG,IAAI,CAAC,iCAAiC,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,GACxH,CAAC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,eAAe,CAAA;CAAE,GAAG,IAAI,CAAC,iCAAiC,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC;AAE1H,UAAU,iCAAiC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE;QACZ,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,SAAS,CAAC,EAAE;QACV,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,aAAa,CAAC,EAAE,iBAAiB,GAAG,eAAe,CAAC;IACpD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,MAAO,SAAQ,aAAa;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa;IACb,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,MAAO,SAAQ,WAAW;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa;IACb,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,eAAe;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACxC,qBAAqB;IACrB,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,iBAAiB;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB"}
@@ -1,12 +1,12 @@
1
1
  import { WebContents } from 'electron';
2
- import type { ElectronWindowsManagerOptions, BWItem, BVItem } from '../common';
2
+ import type { ElectronWindowsManagerOptions, BWItem, BVItem, PreloadWebContentsConfig } from '../common';
3
3
  export declare const getCustomSession: () => Electron.Session;
4
4
  export declare const enable: (win: WebContents) => void;
5
5
  export declare class WindowsManager {
6
6
  loadingViewUrl: string | undefined;
7
7
  errorViewUrl: string | undefined;
8
8
  preload?: string;
9
- preloadWebContentsUrl?: string;
9
+ preloadWebContentsConfig?: PreloadWebContentsConfig;
10
10
  windows: Map<number, BWItem | BVItem>;
11
11
  preloadedBW: BWItem | null;
12
12
  preloadedBW_FramelessWithButtons: BWItem | null;
@@ -14,6 +14,8 @@ export declare class WindowsManager {
14
14
  preloadedBV: BVItem | null;
15
15
  preloading: boolean;
16
16
  webviewDomainWhiteList: string[];
17
+ private createQueue;
18
+ private isCreating;
17
19
  /**
18
20
  * webview 域名白名单
19
21
  * 传入格式示例:
@@ -30,18 +32,42 @@ export declare class WindowsManager {
30
32
  * - 不带点的(如 example.com)只匹配主域名。
31
33
  * - 'localhost'、'127.0.0.1'、'::1' 以及局域网 IP(如 192.168.x.x、10.x.x.x、172.16.x.x~172.31.x.x)都视为本地白名单。
32
34
  */
33
- constructor(preload?: string, loadingViewUrl?: string, errorViewUrl?: string, preloadWebContentsUrl?: string, webviewDomainWhiteList?: string[]);
34
- setPreloadWebContentsUrl(preloadWebContentsUrl: string): void;
35
+ constructor(preload?: string, loadingViewUrl?: string, errorViewUrl?: string, preloadWebContentsConfig?: PreloadWebContentsConfig, webviewDomainWhiteList?: string[]);
36
+ /**
37
+ * 设置预加载的webContents配置
38
+ * @param preloadWebContentsConfig 预加载的webContents配置
39
+ */
40
+ setPreloadWebContentsConfig(preloadWebContentsConfig: PreloadWebContentsConfig): void;
41
+ /**
42
+ * 预加载实例
43
+ */
35
44
  private _preloadInstances;
45
+ /**
46
+ * 创建预加载的窗口
47
+ * @param options 窗口选项
48
+ * @returns 预加载的窗口
49
+ */
36
50
  private _createPreloadBW;
51
+ /**
52
+ * 创建预加载的浏览器视图
53
+ * @returns 预加载的浏览器视图
54
+ */
37
55
  private _createPreloadBV;
38
56
  create(options: Omit<ElectronWindowsManagerOptions, 'type'> & {
39
57
  type?: 'BW';
40
- }): BWItem;
58
+ }): Promise<BWItem>;
41
59
  create(options: ElectronWindowsManagerOptions & {
42
60
  type: 'BV';
43
- }): BVItem;
44
- create(options: ElectronWindowsManagerOptions): BWItem | BVItem;
61
+ }): Promise<BVItem>;
62
+ create(options: ElectronWindowsManagerOptions): Promise<BVItem | BWItem>;
63
+ /**
64
+ * 处理创建队列
65
+ */
66
+ private processCreateQueue;
67
+ /**
68
+ * 实际的窗口创建逻辑
69
+ */
70
+ private _createWindow;
45
71
  _setLoadingView(window: BWItem, createOptions: ElectronWindowsManagerOptions): void;
46
72
  get(idOrName: string | number): BWItem | BVItem | undefined;
47
73
  getAll(type: 'BW'): Map<number, BWItem>;
@@ -57,5 +83,5 @@ export declare class WindowsManager {
57
83
  createPreloadWebContents(url: string): Promise<unknown>;
58
84
  }
59
85
  export declare let isInitialized: boolean;
60
- export declare const initialize: (preload?: string, loadingViewUrl?: string, errorViewUrl?: string, preloadWebContentsUrl?: string, webviewDomainWhiteList?: string[]) => WindowsManager;
86
+ export declare const initialize: (preload?: string, loadingViewUrl?: string, errorViewUrl?: string, preloadWebContentsConfig?: PreloadWebContentsConfig, webviewDomainWhiteList?: string[]) => WindowsManager;
61
87
  //# 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;AAIvI,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;AAoBD,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,gCAAgC,EAAE,MAAM,GAAG,IAAI,CAAQ;IACvD,8BAA8B,EAAE,MAAM,GAAG,IAAI,CAAQ;IACrD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IAClC,UAAU,EAAE,OAAO,CAAS;IAC5B,sBAAsB,EAAE,MAAM,EAAE,CAAM;IACtC;;;;;;;;;;;;;;;OAeG;gBACS,OAAO,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,qBAAqB,CAAC,EAAE,MAAM,EAAE,sBAAsB,CAAC,EAAE,MAAM,EAAE;IAe/I,wBAAwB,CAAC,qBAAqB,EAAE,MAAM;YAgBxC,iBAAiB;IAwB/B,OAAO,CAAC,gBAAgB;IA2CxB,OAAO,CAAC,gBAAgB;IAyCxB,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;IAsX/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,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM;IAqCjD,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS;IAgB9E,UAAU;IAKV,OAAO,CAAC,0BAA0B;IAoBlC,OAAO,CAAC,wBAAwB;IAiB1B,wBAAwB,CAAC,GAAG,EAAE,MAAM;CAqB3C;AAID,eAAO,IAAI,aAAa,SAAQ,CAAC;AAEjC,eAAO,MAAM,UAAU,aAAc,MAAM,mBAAmB,MAAM,iBAAiB,MAAM,0BAA0B,MAAM,2BAA2B,MAAM,EAAE,KAAG,cA4QhK,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/main/index.ts"],"names":[],"mappings":"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"}
package/esm/main/index.js CHANGED
@@ -56,30 +56,43 @@ class WindowsManager {
56
56
  * - 不带点的(如 example.com)只匹配主域名。
57
57
  * - 'localhost'、'127.0.0.1'、'::1' 以及局域网 IP(如 192.168.x.x、10.x.x.x、172.16.x.x~172.31.x.x)都视为本地白名单。
58
58
  */
59
- constructor(preload, loadingViewUrl, errorViewUrl, preloadWebContentsUrl, webviewDomainWhiteList) {
59
+ constructor(preload, loadingViewUrl, errorViewUrl, preloadWebContentsConfig, webviewDomainWhiteList) {
60
+ // 预加载的窗口
60
61
  this.preloadedBW = null;
62
+ // 预加载的窗口(无边框,有按钮)
61
63
  this.preloadedBW_FramelessWithButtons = null;
64
+ // 预加载的窗口(无边框,无按钮)
62
65
  this.preloadedBW_FramelessNoButtons = null;
66
+ // 预加载的浏览器视图
63
67
  this.preloadedBV = null;
64
68
  this.preloading = false;
65
69
  this.webviewDomainWhiteList = [];
70
+ // 创建队列相关属性
71
+ this.createQueue = [];
72
+ this.isCreating = false;
66
73
  this.preload = preload;
67
74
  this.windows = new Map();
68
75
  this.loadingViewUrl = `${loadingViewUrl ?? ''}`;
69
76
  this.errorViewUrl = `${errorViewUrl ?? ''}`;
70
- this.preloadWebContentsUrl = `${preloadWebContentsUrl ?? ''}`;
77
+ this.preloadWebContentsConfig = preloadWebContentsConfig;
71
78
  this.webviewDomainWhiteList = webviewDomainWhiteList || [];
72
- log('log', 'preloadWebContentsUrl: ', this.preloadWebContentsUrl);
73
- if (this.preloadWebContentsUrl) {
79
+ log('log', 'preloadWebContentsConfig: ', this.preloadWebContentsConfig);
80
+ if (this.preloadWebContentsConfig) {
74
81
  app.on('ready', () => {
75
- this._preloadInstances();
82
+ if (this.preloadWebContentsConfig) {
83
+ this.setPreloadWebContentsConfig(this.preloadWebContentsConfig);
84
+ }
76
85
  });
77
86
  }
78
87
  }
79
- setPreloadWebContentsUrl(preloadWebContentsUrl) {
88
+ /**
89
+ * 设置预加载的webContents配置
90
+ * @param preloadWebContentsConfig 预加载的webContents配置
91
+ */
92
+ setPreloadWebContentsConfig(preloadWebContentsConfig) {
80
93
  try {
81
- this.preloadWebContentsUrl = preloadWebContentsUrl;
82
- if (this.preloadWebContentsUrl) {
94
+ this.preloadWebContentsConfig = preloadWebContentsConfig;
95
+ if (this.preloadWebContentsConfig) {
83
96
  this._preloadInstances();
84
97
  }
85
98
  else {
@@ -90,27 +103,42 @@ class WindowsManager {
90
103
  }
91
104
  }
92
105
  catch (error) {
93
- log('error', 'setPreloadWebContentsUrl error:', error);
106
+ log('error', 'setPreloadWebContentsConfig error:', error);
94
107
  }
95
108
  }
109
+ /**
110
+ * 预加载实例
111
+ */
96
112
  async _preloadInstances() {
97
113
  if (this.preloading)
98
114
  return;
99
115
  this.preloading = true;
100
116
  try {
101
- if (this.preloadWebContentsUrl) {
102
- this.preloadedBW = this.preloadedBW || await this._createPreloadBW({});
103
- this.preloadedBW_FramelessWithButtons = this.preloadedBW_FramelessWithButtons || await this._createPreloadBW({
104
- frame: false,
105
- transparent: true,
106
- titleBarStyle: 'hidden',
107
- });
108
- this.preloadedBW_FramelessNoButtons = this.preloadedBW_FramelessNoButtons || await this._createPreloadBW({
109
- frame: false,
110
- transparent: true,
111
- titleBarStyle: 'customButtonsOnHover',
112
- });
113
- this.preloadedBV = this.preloadedBV || await this._createPreloadBV();
117
+ if (this.preloadWebContentsConfig) {
118
+ // 根据配置决定是否预加载普通窗口
119
+ if (this.preloadWebContentsConfig.enableBW !== false) {
120
+ this.preloadedBW = this.preloadedBW || await this._createPreloadBW({});
121
+ }
122
+ // 根据配置决定是否预加载无边框有按钮的窗口
123
+ if (this.preloadWebContentsConfig.enableBW_FramelessWithButtons !== false) {
124
+ this.preloadedBW_FramelessWithButtons = this.preloadedBW_FramelessWithButtons || await this._createPreloadBW({
125
+ frame: false,
126
+ transparent: true,
127
+ titleBarStyle: 'hidden',
128
+ });
129
+ }
130
+ // 根据配置决定是否预加载无边框无按钮的窗口
131
+ if (this.preloadWebContentsConfig.enableBW_FramelessNoButtons !== false) {
132
+ this.preloadedBW_FramelessNoButtons = this.preloadedBW_FramelessNoButtons || await this._createPreloadBW({
133
+ frame: false,
134
+ transparent: true,
135
+ titleBarStyle: 'customButtonsOnHover',
136
+ });
137
+ }
138
+ // 根据配置决定是否预加载浏览器视图
139
+ if (this.preloadWebContentsConfig.enableBV !== false) {
140
+ this.preloadedBV = this.preloadedBV || await this._createPreloadBV();
141
+ }
114
142
  }
115
143
  }
116
144
  catch (e) {
@@ -118,23 +146,30 @@ class WindowsManager {
118
146
  }
119
147
  this.preloading = false;
120
148
  }
149
+ /**
150
+ * 创建预加载的窗口
151
+ * @param options 窗口选项
152
+ * @returns 预加载的窗口
153
+ */
121
154
  _createPreloadBW(options = {}) {
122
155
  return new Promise((resolve) => {
123
156
  const preload = this.preload;
124
- const url = this.preloadWebContentsUrl;
125
- if (this.preloadWebContentsUrl) {
157
+ const url = this.preloadWebContentsConfig?.url;
158
+ if (this.preloadWebContentsConfig?.url) {
159
+ const webPreferences = (options.webPreferences || {});
126
160
  const instance = new BrowserWindow({
127
- show: false,
128
161
  ...options,
162
+ show: false,
163
+ backgroundColor: '#ffffff',
129
164
  webPreferences: {
165
+ ...webPreferences,
130
166
  webviewTag: true,
131
167
  plugins: true,
132
168
  nodeIntegration: true,
133
169
  contextIsolation: false,
134
170
  backgroundThrottling: false,
135
171
  webSecurity: false,
136
- preload: preload,
137
- ...(options.webPreferences || {}),
172
+ preload: webPreferences.preload || preload,
138
173
  }
139
174
  });
140
175
  try {
@@ -151,31 +186,38 @@ class WindowsManager {
151
186
  log('error', '预加载 BW 设置 _id 失败', error);
152
187
  }
153
188
  // @ts-ignore
154
- log('log', '创建预BW: ', instance._id, this.preloadWebContentsUrl);
155
- instance.webContents.once('did-finish-load', () => {
156
- resolve(instance);
157
- });
158
- instance.webContents.once('did-fail-load', () => {
159
- resolve(instance);
160
- });
161
- instance.loadURL(url || 'about:blank');
189
+ log('log', '创建预BW: ', instance._id, this.preloadWebContentsConfig?.url);
190
+ // instance.webContents.once('did-finish-load', () => {
191
+ // resolve(instance as BWItem);
192
+ // });
193
+ // instance.webContents.once('did-fail-load', () => {
194
+ // resolve(instance as BWItem);
195
+ // });
196
+ instance.loadURL(url ? `${url}` : 'about:blank');
197
+ resolve(instance);
162
198
  }
163
199
  });
164
200
  }
165
- _createPreloadBV() {
201
+ /**
202
+ * 创建预加载的浏览器视图
203
+ * @returns 预加载的浏览器视图
204
+ */
205
+ _createPreloadBV(options = {}) {
166
206
  return new Promise((resolve) => {
167
207
  const preload = this.preload;
168
- const url = this.preloadWebContentsUrl;
169
- if (this.preloadWebContentsUrl) {
208
+ const url = this.preloadWebContentsConfig?.url;
209
+ if (this.preloadWebContentsConfig?.url) {
210
+ const webPreferences = (options.webPreferences || {});
170
211
  const instance = new BrowserView({
171
212
  webPreferences: {
213
+ ...webPreferences,
172
214
  webviewTag: true,
173
215
  plugins: true,
174
216
  nodeIntegration: true,
175
217
  contextIsolation: false,
176
218
  // backgroundThrottling: false,
177
219
  webSecurity: false,
178
- preload: preload,
220
+ preload: webPreferences.preload || preload,
179
221
  }
180
222
  });
181
223
  try {
@@ -192,56 +234,118 @@ class WindowsManager {
192
234
  log('error', '预加载 BV 设置 _id 失败', error);
193
235
  }
194
236
  // @ts-ignore
195
- log('log', '创建预BV: ', instance._id, this.preloadWebContentsUrl);
196
- instance.webContents.once('did-finish-load', () => {
197
- resolve(instance);
198
- });
199
- instance.webContents.once('did-fail-load', () => {
200
- resolve(instance);
201
- });
237
+ log('log', '创建预BV: ', instance._id, this.preloadWebContentsConfig?.url);
238
+ // instance.webContents.once('did-finish-load', () => {
239
+ // resolve(instance as BVItem);
240
+ // });
241
+ // instance.webContents.once('did-fail-load', () => {
242
+ // resolve(instance as BVItem);
243
+ // });
202
244
  instance.webContents.loadURL(url || 'about:blank');
245
+ resolve(instance);
203
246
  }
204
247
  });
205
248
  }
206
249
  create(options) {
250
+ return new Promise((resolve, reject) => {
251
+ // 将创建请求添加到队列
252
+ this.createQueue.push({ options, resolve, reject });
253
+ // 如果当前没有在创建,则开始处理队列
254
+ if (!this.isCreating) {
255
+ this.processCreateQueue();
256
+ }
257
+ });
258
+ }
259
+ /**
260
+ * 处理创建队列
261
+ */
262
+ async processCreateQueue() {
263
+ if (this.isCreating || this.createQueue.length === 0) {
264
+ return;
265
+ }
266
+ this.isCreating = true;
267
+ while (this.createQueue.length > 0) {
268
+ const { options, resolve, reject } = this.createQueue.shift();
269
+ try {
270
+ const window = await this._createWindow(options);
271
+ resolve(window);
272
+ }
273
+ catch (error) {
274
+ log('error', 'create window failed:', error);
275
+ reject(error);
276
+ }
277
+ }
278
+ this.isCreating = false;
279
+ }
280
+ /**
281
+ * 实际的窗口创建逻辑
282
+ */
283
+ async _createWindow(options) {
207
284
  let window;
208
285
  const { usePreload = true, type = 'BW', name = 'anonymous', url, loadingView = { url: undefined }, errorView = { url: undefined }, browserWindow: browserWindowOptions, openDevTools = false, preventOriginClose = false, } = options;
209
286
  options.type = type;
210
287
  // 优先复用预创建实例
211
288
  let preloadWin = null;
212
- if (type === 'BW' && usePreload && this.preloadWebContentsUrl) {
289
+ if (type === 'BW' && usePreload && this.preloadWebContentsConfig?.url) {
213
290
  const bwOptions = browserWindowOptions || {};
214
- if (bwOptions.frame === false && bwOptions.titleBarStyle === 'hidden') {
215
- preloadWin = this.preloadedBW_FramelessWithButtons;
216
- this.preloadedBW_FramelessWithButtons = null;
217
- setTimeout(() => this._createPreloadBW({ frame: false, transparent: true, titleBarStyle: 'hidden' }), 0);
218
- }
219
- else if (bwOptions.frame === false && bwOptions.titleBarStyle === 'customButtonsOnHover') {
220
- preloadWin = this.preloadedBW_FramelessNoButtons;
221
- this.preloadedBW_FramelessNoButtons = null;
222
- setTimeout(() => this._createPreloadBW({ frame: false, transparent: true, titleBarStyle: 'customButtonsOnHover' }), 0);
291
+ if (bwOptions.frame === false) {
292
+ if (bwOptions.titleBarStyle === 'customButtonsOnHover') {
293
+ if (this.preloadWebContentsConfig.enableBW_FramelessNoButtons !== false) {
294
+ preloadWin = this.preloadedBW_FramelessNoButtons;
295
+ this.preloadedBW_FramelessNoButtons = await this._createPreloadBW({
296
+ frame: false,
297
+ transparent: true,
298
+ titleBarStyle: 'customButtonsOnHover',
299
+ webPreferences: {
300
+ preload: bwOptions?.webPreferences?.preload || this.preload,
301
+ }
302
+ });
303
+ }
304
+ }
305
+ else {
306
+ if (this.preloadWebContentsConfig.enableBW_FramelessWithButtons !== false) {
307
+ preloadWin = this.preloadedBW_FramelessWithButtons;
308
+ this.preloadedBW_FramelessWithButtons = await this._createPreloadBW({
309
+ frame: false,
310
+ transparent: true,
311
+ titleBarStyle: 'hidden',
312
+ webPreferences: {
313
+ preload: this.preload,
314
+ }
315
+ });
316
+ }
317
+ }
223
318
  }
224
319
  else {
225
- preloadWin = this.preloadedBW;
226
- this.preloadedBW = null;
227
- setTimeout(() => this._createPreloadBW({}), 0);
320
+ if (this.preloadWebContentsConfig.enableBW !== false) {
321
+ preloadWin = this.preloadedBW;
322
+ this.preloadedBW = await this._createPreloadBW({
323
+ webPreferences: {
324
+ preload: bwOptions?.webPreferences?.preload || this.preload,
325
+ }
326
+ });
327
+ }
228
328
  }
229
329
  }
230
- if (type === 'BV' && usePreload && this.preloadWebContentsUrl) {
330
+ if (type === 'BV' && usePreload && this.preloadWebContentsConfig?.url) {
331
+ const bvOptions = browserWindowOptions || {};
231
332
  preloadWin = this.preloadedBV;
232
- this.preloadedBV = null;
233
- setTimeout(() => this._createPreloadBV(), 0);
333
+ this.preloadedBV = await this._createPreloadBV({
334
+ webPreferences: {
335
+ preload: bvOptions?.webPreferences?.preload || this.preload,
336
+ }
337
+ });
234
338
  }
235
339
  if (preloadWin) {
236
340
  const win = preloadWin;
237
- log('log', `${name} 使用预加载窗口`, win._id);
341
+ log('log', `${name} 使用预加载窗口(${type})`, win._id);
238
342
  win._type = 'BW';
239
343
  win._name = options.name || 'anonymous';
240
344
  win._extraData = `${options?.extraData || ''}`;
241
345
  win._initUrl = `${options?.url || ''}`;
242
346
  // @ts-ignore
243
- win?.removeAllListeners && win?.removeAllListeners?.();
244
- win.webContents.removeAllListeners && win.webContents.removeAllListeners();
347
+ // win?.removeAllListeners && win?.removeAllListeners?.();
348
+ // win.webContents.removeAllListeners && win.webContents.removeAllListeners();
245
349
  if (type === 'BW') {
246
350
  // @ts-ignore
247
351
  this._applyBrowserWindowOptions(win, options);
@@ -323,6 +427,8 @@ class WindowsManager {
323
427
  log('error', 'enable: ', error);
324
428
  }
325
429
  }
430
+ // 停止加载
431
+ window.webContents?.stop?.();
326
432
  // @ts-ignore
327
433
  try {
328
434
  window.id = Number(`${window.id || window.webContents.id}`);
@@ -351,7 +457,7 @@ class WindowsManager {
351
457
  if (errorView?.url) {
352
458
  if (type === 'BW') {
353
459
  const showErrorView = lodash.debounce(() => {
354
- const _url = window?.webContents?.getURL?.() || url;
460
+ const _url = window._initUrl;
355
461
  /**
356
462
  * 判断是否是错误视图
357
463
  */
@@ -365,16 +471,37 @@ class WindowsManager {
365
471
  sessionStorage.setItem(key, "${_url}");
366
472
  `);
367
473
  }
368
- }, 300);
474
+ }, 1000);
369
475
  // @ts-ignore
370
476
  window.webContents.on('did-fail-load', (event, errorCode, errorDescription, validatedURL, isMainFrame) => {
371
477
  if (isMainFrame) {
372
478
  showErrorView();
373
479
  }
374
480
  });
481
+ // 当开始加载时取消错误视图
375
482
  window.webContents.on('did-start-loading', () => {
376
483
  showErrorView.cancel();
377
484
  });
485
+ // 当导航开始时取消错误视图
486
+ window.webContents.on('did-start-navigation', () => {
487
+ showErrorView.cancel();
488
+ });
489
+ // 当页面重新加载时取消错误视图
490
+ window.webContents.on('did-navigate', () => {
491
+ showErrorView.cancel();
492
+ });
493
+ // 当页面完成加载时取消错误视图
494
+ window.webContents.on('did-finish-load', () => {
495
+ showErrorView.cancel();
496
+ });
497
+ // 当窗口关闭时取消错误视图
498
+ window.webContents.on('close', () => {
499
+ showErrorView.cancel();
500
+ });
501
+ // 当窗口销毁时取消错误视图
502
+ window.webContents.on('destroyed', () => {
503
+ showErrorView.cancel();
504
+ });
378
505
  }
379
506
  }
380
507
  window.webContents.on('did-attach-webview', (_event, webContents) => {
@@ -456,10 +583,6 @@ class WindowsManager {
456
583
  parentWin?.addBrowserView(window);
457
584
  log('log', 'create - addBrowserView');
458
585
  }
459
- // @ts-ignore
460
- window.loadURL ? window.loadURL(options.url) : window.webContents.loadURL(options.url);
461
- // @ts-ignore
462
- window.focus ? window.focus() : window.webContents.focus();
463
586
  this.windows.set(window.id || window._id || window.webContents.id, window);
464
587
  log('log', 'create', this.windows.keys());
465
588
  // 初始化值
@@ -552,6 +675,12 @@ class WindowsManager {
552
675
  log('error', 'focus', error);
553
676
  }
554
677
  }
678
+ if (options.url) {
679
+ // @ts-ignore
680
+ window.loadURL ? window.loadURL(options.url) : window.webContents.loadURL(options.url);
681
+ // @ts-ignore
682
+ window.focus ? window.focus() : window.webContents.focus();
683
+ }
555
684
  }
556
685
  catch (error) {
557
686
  log('error', 'create', error);
@@ -815,6 +944,11 @@ class WindowsManager {
815
944
  if (typeof browserWindowOptions.alwaysOnTop === 'boolean') {
816
945
  win.setAlwaysOnTop(browserWindowOptions.alwaysOnTop);
817
946
  }
947
+ // 设置背景颜色
948
+ if (typeof browserWindowOptions.backgroundColor === 'string') {
949
+ win.setBackgroundColor(browserWindowOptions.backgroundColor);
950
+ }
951
+ win.center();
818
952
  // 可继续扩展其他动态属性
819
953
  }
820
954
  _applyBrowserViewOptions(view, options) {
@@ -835,7 +969,7 @@ class WindowsManager {
835
969
  // 生成一个bv 做为预加载资源窗口,加载完成后销毁
836
970
  async createPreloadWebContents(url) {
837
971
  return new Promise(async (resolve, reject) => {
838
- let bv = this.create({
972
+ let bv = await this.create({
839
973
  type: 'BV',
840
974
  url,
841
975
  name: `preload-web-contents-${md5(url)}`,
@@ -858,7 +992,7 @@ class WindowsManager {
858
992
  // @ts-ignore
859
993
  global['__ELECTRON_WINDOWS_MANAGER__'] = undefined;
860
994
  let isInitialized = false;
861
- const initialize = (preload, loadingViewUrl, errorViewUrl, preloadWebContentsUrl, webviewDomainWhiteList) => {
995
+ const initialize = (preload, loadingViewUrl, errorViewUrl, preloadWebContentsConfig, webviewDomainWhiteList) => {
862
996
  // @ts-ignore
863
997
  if (isInitialized && global['__ELECTRON_WINDOWS_MANAGER__']) {
864
998
  // @ts-ignore
@@ -866,7 +1000,7 @@ const initialize = (preload, loadingViewUrl, errorViewUrl, preloadWebContentsUrl
866
1000
  }
867
1001
  isInitialized = true;
868
1002
  // @ts-ignore
869
- const wm = global['__ELECTRON_WINDOWS_MANAGER__'] = new WindowsManager(preload, loadingViewUrl, errorViewUrl, preloadWebContentsUrl, webviewDomainWhiteList);
1003
+ const wm = global['__ELECTRON_WINDOWS_MANAGER__'] = new WindowsManager(preload, loadingViewUrl, errorViewUrl, preloadWebContentsConfig, webviewDomainWhiteList);
870
1004
  eIpc.mainIPC.handleRenderer('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', async (data) => {
871
1005
  if (data?.type === 'create') {
872
1006
  const opt = data;
@@ -890,7 +1024,7 @@ const initialize = (preload, loadingViewUrl, errorViewUrl, preloadWebContentsUrl
890
1024
  winInitUrl: `${findWin?._initUrl || ''}`,
891
1025
  };
892
1026
  }
893
- const res = wm.create(opt.data);
1027
+ const res = await wm.create(opt.data);
894
1028
  return {
895
1029
  winId: Number(`${res.id || res._id || -1}`),
896
1030
  winName: `${res?._name || ''}`,
@@ -1026,9 +1160,9 @@ const initialize = (preload, loadingViewUrl, errorViewUrl, preloadWebContentsUrl
1026
1160
  return undefined;
1027
1161
  }
1028
1162
  // 是否开启预加载窗口
1029
- if (data?.type === 'setPreloadWebContentsUrl') {
1163
+ if (data?.type === 'setPreloadWebContentsConfig') {
1030
1164
  const opt = data;
1031
- wm.setPreloadWebContentsUrl(opt.data);
1165
+ wm.setPreloadWebContentsConfig(opt.data);
1032
1166
  }
1033
1167
  if (data?.type === 'createPreloadWebContents') {
1034
1168
  const opt = data;