@flighthq/host-electron 0.5.1-next.920.da8f530 → 0.6.0

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.
Files changed (137) hide show
  1. package/README.md +2 -2
  2. package/dist/contract.d.ts +19 -24
  3. package/dist/contract.d.ts.map +1 -1
  4. package/dist/contract.js +18 -24
  5. package/dist/contract.js.map +1 -1
  6. package/dist/electronApp.d.ts +62 -34
  7. package/dist/electronApp.d.ts.map +1 -1
  8. package/dist/electronApp.js +175 -234
  9. package/dist/electronApp.js.map +1 -1
  10. package/dist/electronClipboard.d.ts +7 -5
  11. package/dist/electronClipboard.d.ts.map +1 -1
  12. package/dist/electronClipboard.js +91 -66
  13. package/dist/electronClipboard.js.map +1 -1
  14. package/dist/electronDefaultHostGroups.d.ts +59 -0
  15. package/dist/electronDefaultHostGroups.d.ts.map +1 -0
  16. package/dist/electronDefaultHostGroups.js +109 -0
  17. package/dist/electronDefaultHostGroups.js.map +1 -0
  18. package/dist/electronDialog.d.ts +12 -9
  19. package/dist/electronDialog.d.ts.map +1 -1
  20. package/dist/electronDialog.js +28 -21
  21. package/dist/electronDialog.js.map +1 -1
  22. package/dist/electronIpc.d.ts +13 -11
  23. package/dist/electronIpc.d.ts.map +1 -1
  24. package/dist/electronIpc.js +32 -26
  25. package/dist/electronIpc.js.map +1 -1
  26. package/dist/electronMenu.d.ts +12 -6
  27. package/dist/electronMenu.d.ts.map +1 -1
  28. package/dist/electronMenu.js +41 -30
  29. package/dist/electronMenu.js.map +1 -1
  30. package/dist/electronMenuTemplate.d.ts +2 -1
  31. package/dist/electronMenuTemplate.d.ts.map +1 -1
  32. package/dist/electronMenuTemplate.js.map +1 -1
  33. package/dist/electronNotification.d.ts +25 -7
  34. package/dist/electronNotification.d.ts.map +1 -1
  35. package/dist/electronNotification.js +39 -16
  36. package/dist/electronNotification.js.map +1 -1
  37. package/dist/electronPlatform.d.ts +5 -3
  38. package/dist/electronPlatform.d.ts.map +1 -1
  39. package/dist/electronPlatform.js +9 -7
  40. package/dist/electronPlatform.js.map +1 -1
  41. package/dist/electronPower.d.ts +22 -11
  42. package/dist/electronPower.d.ts.map +1 -1
  43. package/dist/electronPower.js +48 -59
  44. package/dist/electronPower.js.map +1 -1
  45. package/dist/electronProtocol.d.ts +16 -8
  46. package/dist/electronProtocol.d.ts.map +1 -1
  47. package/dist/electronProtocol.js +45 -28
  48. package/dist/electronProtocol.js.map +1 -1
  49. package/dist/electronRegister.d.ts +5 -7
  50. package/dist/electronRegister.d.ts.map +1 -1
  51. package/dist/electronRegister.js +72 -99
  52. package/dist/electronRegister.js.map +1 -1
  53. package/dist/electronScreen.d.ts +7 -6
  54. package/dist/electronScreen.d.ts.map +1 -1
  55. package/dist/electronScreen.js +17 -14
  56. package/dist/electronScreen.js.map +1 -1
  57. package/dist/electronShell.d.ts +16 -8
  58. package/dist/electronShell.d.ts.map +1 -1
  59. package/dist/electronShell.js +50 -43
  60. package/dist/electronShell.js.map +1 -1
  61. package/dist/electronShortcut.d.ts +6 -4
  62. package/dist/electronShortcut.d.ts.map +1 -1
  63. package/dist/electronShortcut.js +16 -10
  64. package/dist/electronShortcut.js.map +1 -1
  65. package/dist/electronStorage.d.ts +5 -3
  66. package/dist/electronStorage.d.ts.map +1 -1
  67. package/dist/electronStorage.js +9 -7
  68. package/dist/electronStorage.js.map +1 -1
  69. package/dist/electronTray.d.ts +38 -21
  70. package/dist/electronTray.d.ts.map +1 -1
  71. package/dist/electronTray.js +110 -76
  72. package/dist/electronTray.js.map +1 -1
  73. package/dist/electronUpdater.d.ts +6 -3
  74. package/dist/electronUpdater.d.ts.map +1 -1
  75. package/dist/electronUpdater.js +10 -7
  76. package/dist/electronUpdater.js.map +1 -1
  77. package/dist/electronWindow.d.ts +23 -7
  78. package/dist/electronWindow.d.ts.map +1 -1
  79. package/dist/electronWindow.js +234 -152
  80. package/dist/electronWindow.js.map +1 -1
  81. package/dist/index.d.ts +19 -1
  82. package/dist/index.d.ts.map +1 -1
  83. package/dist/index.js +18 -1
  84. package/dist/index.js.map +1 -1
  85. package/dist/types/ElectronApi.d.ts +393 -0
  86. package/dist/types/ElectronApi.d.ts.map +1 -0
  87. package/dist/types/ElectronApi.js +20 -0
  88. package/dist/types/ElectronApi.js.map +1 -0
  89. package/dist/types/ElectronAppCapabilitiesFor.d.ts +8 -0
  90. package/dist/types/ElectronAppCapabilitiesFor.d.ts.map +1 -0
  91. package/dist/types/ElectronAppCapabilitiesFor.js +2 -0
  92. package/dist/types/ElectronAppCapabilitiesFor.js.map +1 -0
  93. package/dist/types/ElectronHost.d.ts +43 -0
  94. package/dist/types/ElectronHost.d.ts.map +1 -0
  95. package/dist/types/ElectronHost.js +2 -0
  96. package/dist/types/ElectronHost.js.map +1 -0
  97. package/dist/types/ElectronHostGroups.d.ts +85 -0
  98. package/dist/types/ElectronHostGroups.d.ts.map +1 -0
  99. package/dist/types/ElectronHostGroups.js +2 -0
  100. package/dist/types/ElectronHostGroups.js.map +1 -0
  101. package/dist/types/ElectronHostOptions.d.ts +7 -0
  102. package/dist/types/ElectronHostOptions.d.ts.map +1 -0
  103. package/dist/types/ElectronHostOptions.js +2 -0
  104. package/dist/types/ElectronHostOptions.js.map +1 -0
  105. package/dist/types/ElectronProtocolCapabilities.d.ts +3 -0
  106. package/dist/types/ElectronProtocolCapabilities.d.ts.map +1 -0
  107. package/dist/types/ElectronProtocolCapabilities.js +2 -0
  108. package/dist/types/ElectronProtocolCapabilities.js.map +1 -0
  109. package/dist/types/ElectronTrayCapabilitiesFor.d.ts +7 -0
  110. package/dist/types/ElectronTrayCapabilitiesFor.d.ts.map +1 -0
  111. package/dist/types/ElectronTrayCapabilitiesFor.js +2 -0
  112. package/dist/types/ElectronTrayCapabilitiesFor.js.map +1 -0
  113. package/dist/types/index.d.ts +7 -0
  114. package/dist/types/index.d.ts.map +1 -0
  115. package/dist/types/index.js +7 -0
  116. package/dist/types/index.js.map +1 -0
  117. package/package.json +42 -21
  118. package/src/electronApp.test.ts +158 -131
  119. package/src/electronClipboard.test.ts +40 -13
  120. package/src/electronDefaultHostGroups.test.ts +148 -0
  121. package/src/electronDialog.test.ts +55 -53
  122. package/src/electronHostTreeShaking.test.ts +51 -0
  123. package/src/electronIpc.test.ts +47 -66
  124. package/src/electronMenu.test.ts +61 -47
  125. package/src/electronMenuTemplate.test.ts +1 -1
  126. package/src/electronNotification.test.ts +71 -21
  127. package/src/electronPlatform.test.ts +17 -12
  128. package/src/electronPower.test.ts +112 -88
  129. package/src/electronProtocol.test.ts +68 -35
  130. package/src/electronRegister.test.ts +280 -26
  131. package/src/electronScreen.test.ts +34 -25
  132. package/src/electronShell.test.ts +99 -59
  133. package/src/electronShortcut.test.ts +22 -19
  134. package/src/electronStorage.test.ts +26 -24
  135. package/src/electronTray.test.ts +225 -109
  136. package/src/electronUpdater.test.ts +26 -19
  137. package/src/electronWindow.test.ts +229 -101
@@ -1,15 +1,30 @@
1
- import { createApplicationWindow } from '@flighthq/application/contract';
1
+ import { createAppWindow } from '@flighthq/app';
2
2
  import { connectSignal } from '@flighthq/signals/contract';
3
- import type { ElectronApi, ElectronBrowserWindowOptions, ElectronRectangle } from '@flighthq/types/contract';
4
3
 
5
4
  import {
6
- createElectronWindowBackend,
7
- getApplicationWindowForElectronId,
5
+ electronHostWindow,
6
+ electronHostWindowAppearance,
7
+ electronHostWindowAttach,
8
+ electronHostWindowAttention,
9
+ electronHostWindowContentProtection,
10
+ electronHostWindowFocus,
11
+ electronHostWindowFullscreen,
12
+ electronHostWindowGeometry,
13
+ electronHostWindowHierarchy,
14
+ electronHostWindowLifecycle,
15
+ electronHostWindowProgress,
16
+ electronHostWindowShadow,
17
+ electronHostWindowShell,
18
+ electronHostWindowSizeConstraints,
19
+ electronHostWindowState,
20
+ electronHostWindowVisibility,
21
+ electronHostWindowZOrder,
22
+ getAppWindowForElectronId,
8
23
  getElectronBrowserWindow,
9
24
  getElectronWindowId,
10
- initializeElectronWindowBackend,
11
- resetElectronWindowBackendForTest,
12
- } from './electronWindow';
25
+ resetElectronHostWindowForTest,
26
+ } from './electronWindow.ts';
27
+ import type { ElectronApi, ElectronBrowserWindowOptions, ElectronRectangle } from './types/index.ts';
13
28
 
14
29
  interface FakeBrowserWindow {
15
30
  id: number;
@@ -142,90 +157,107 @@ function fakeElectron(): { electron: ElectronApi; created: FakeBrowserWindow[] }
142
157
  return { electron, created };
143
158
  }
144
159
 
145
- beforeEach(() => resetElectronWindowBackendForTest());
160
+ beforeEach(() => resetElectronHostWindowForTest());
146
161
 
147
- describe('createElectronWindowBackend', () => {
148
- it('adapter-roster axis: publishes all 28 P1 operations without false omissions', () => {
162
+ describe('electronHostWindow', () => {
163
+ it('adapter-roster axis: publishes every window capability and P1 operation without false omissions', () => {
149
164
  const { electron } = fakeElectron();
150
- const backend = createElectronWindowBackend(electron);
151
-
152
- expect(
153
- Object.keys(backend)
154
- .filter((operation) => operation !== 'attach')
155
- .sort(),
156
- ).toEqual([
157
- 'center',
158
- 'close',
159
- 'flashWindowFrame',
165
+ const backend = electronHostWindow(electron);
166
+
167
+ expect(Object.keys(backend).sort()).toEqual([
168
+ 'appearance',
169
+ 'attach',
170
+ 'attention',
171
+ 'contentProtection',
160
172
  'focus',
161
- 'getBounds',
162
- 'hide',
163
- 'maximize',
164
- 'minimize',
165
- 'open',
166
- 'requestAttention',
167
- 'restore',
168
- 'setAlwaysOnTop',
169
- 'setContentProtection',
170
- 'setFullscreen',
171
- 'setHasShadow',
172
- 'setIcon',
173
- 'setMaximumSize',
174
- 'setMenuBarVisible',
175
- 'setMinimumSize',
176
- 'setOpacity',
177
- 'setParent',
178
- 'setPosition',
179
- 'setProgress',
180
- 'setResizable',
181
- 'setSize',
182
- 'setSkipTaskbar',
183
- 'setTitle',
184
- 'show',
173
+ 'fullscreen',
174
+ 'geometry',
175
+ 'hierarchy',
176
+ 'lifecycle',
177
+ 'progress',
178
+ 'shadow',
179
+ 'shell',
180
+ 'sizeConstraints',
181
+ 'state',
182
+ 'visibility',
183
+ 'zOrder',
185
184
  ]);
185
+ const operations = Object.values(backend).flatMap((capability) => Object.keys(capability ?? {}));
186
+ expect(operations).toEqual(
187
+ expect.arrayContaining([
188
+ 'center',
189
+ 'close',
190
+ 'flashWindowFrame',
191
+ 'focus',
192
+ 'getBounds',
193
+ 'hide',
194
+ 'maximize',
195
+ 'minimize',
196
+ 'open',
197
+ 'requestAttention',
198
+ 'restore',
199
+ 'setAlwaysOnTop',
200
+ 'setContentProtection',
201
+ 'setFullscreen',
202
+ 'setHasShadow',
203
+ 'setIcon',
204
+ 'setMaximumSize',
205
+ 'setMenuBarVisible',
206
+ 'setMinimumSize',
207
+ 'setOpacity',
208
+ 'setParent',
209
+ 'setPosition',
210
+ 'setProgress',
211
+ 'setResizable',
212
+ 'setSize',
213
+ 'setSkipTaskbar',
214
+ 'setTitle',
215
+ 'show',
216
+ ]),
217
+ );
186
218
  });
187
219
 
188
220
  it('open creates a BrowserWindow and forwards commands to it', () => {
189
221
  const { electron, created } = fakeElectron();
190
- const backend = createElectronWindowBackend(electron);
191
- const win = createApplicationWindow();
192
- expect(backend.open!(win, { title: 'Flight', width: 640, height: 480 })).toBe(true);
222
+ const backend = electronHostWindow(electron);
223
+ const win = createAppWindow();
224
+ expect(backend.lifecycle!.open(win, { title: 'Flight', width: 640, height: 480 })).toBe(true);
193
225
  expect(created).toHaveLength(1);
194
226
  expect(created[0].options.title).toBe('Flight');
195
- backend.setTitle!(win, 'Renamed');
227
+ backend.appearance!.setTitle(win, 'Renamed');
196
228
  expect(created[0].calls).toContainEqual({ method: 'setTitle', args: ['Renamed'] });
197
229
  });
198
230
 
199
231
  it('getBounds reads from the BrowserWindow into out', () => {
200
232
  const { electron, created } = fakeElectron();
201
- const backend = createElectronWindowBackend(electron);
202
- const win = createApplicationWindow();
203
- backend.open!(win, {});
233
+ const backend = electronHostWindow(electron);
234
+ const win = createAppWindow();
235
+ backend.lifecycle!.open(win, {});
204
236
  created[0].bounds = { x: 10, y: 20, width: 300, height: 400 };
205
237
  const out = { x: 0, y: 0, width: 0, height: 0 };
206
- const result = backend.getBounds!(win, out);
238
+ const result = backend.geometry!.getBounds(win, out);
207
239
  expect(result).toBe(out);
208
240
  expect(out).toEqual({ x: 10, y: 20, width: 300, height: 400 });
209
241
  });
210
242
 
211
243
  it('getBounds falls back to the entity when no window is mapped', () => {
212
244
  const { electron } = fakeElectron();
213
- const backend = createElectronWindowBackend(electron);
214
- const win = createApplicationWindow();
245
+ const backend = electronHostWindow(electron);
246
+ const win = createAppWindow();
215
247
  win.x = 5;
216
248
  win.y = 6;
217
249
  win.width = 70;
218
250
  win.height = 80;
219
251
  const out = { x: 0, y: 0, width: 0, height: 0 };
220
- backend.getBounds!(win, out);
252
+ backend.geometry!.getBounds(win, out);
221
253
  expect(out).toEqual({ x: 5, y: 6, width: 70, height: 80 });
222
254
  });
223
255
 
224
256
  it('forwards an OS minimize event to the entity and emits onMinimize', () => {
225
257
  const { electron, created } = fakeElectron();
226
- const backend = createElectronWindowBackend(electron);
227
- const win = createApplicationWindow();
228
- backend.open!(win, {});
258
+ const backend = electronHostWindow(electron);
259
+ const win = createAppWindow();
260
+ backend.lifecycle!.open(win, {});
229
261
  let emitted = false;
230
262
  connectSignal(win.onMinimize, () => {
231
263
  emitted = true;
@@ -238,12 +270,12 @@ describe('createElectronWindowBackend', () => {
238
270
  it('attaches an existing BrowserWindow with stable identity and no duplicate listeners', () => {
239
271
  const { electron, created } = fakeElectron();
240
272
  const native = new electron.BrowserWindow({ title: 'Existing' }) as unknown as FakeBrowserWindow;
241
- const backend = createElectronWindowBackend(electron);
242
- const win = createApplicationWindow();
273
+ const backend = electronHostWindow(electron);
274
+ const win = createAppWindow();
243
275
 
244
- expect(backend.attach?.(win, native, 'host')).toBe(true);
245
- expect(backend.attach?.(win, native, 'host')).toBe(true);
246
- expect(backend.attach?.(createApplicationWindow(), native, 'host')).toBe(false);
276
+ expect(backend.attach!.attach(win, native, 'host')).toBe(true);
277
+ expect(backend.attach!.attach(win, native, 'host')).toBe(true);
278
+ expect(backend.attach!.attach(createAppWindow(), native, 'host')).toBe(false);
247
279
  expect(created).toHaveLength(1);
248
280
  expect(getElectronBrowserWindow(win)).toBe(native);
249
281
  expect(native.listenerCount('move')).toBe(1);
@@ -252,12 +284,12 @@ describe('createElectronWindowBackend', () => {
252
284
  it('detaches host-owned windows without closing them and does so idempotently', () => {
253
285
  const { electron } = fakeElectron();
254
286
  const native = new electron.BrowserWindow({}) as unknown as FakeBrowserWindow;
255
- const backend = createElectronWindowBackend(electron);
256
- const win = createApplicationWindow();
257
- expect(backend.attach?.(win, native, 'host')).toBe(true);
287
+ const backend = electronHostWindow(electron);
288
+ const win = createAppWindow();
289
+ expect(backend.attach!.attach(win, native, 'host')).toBe(true);
258
290
 
259
- backend.close!(win);
260
- backend.close!(win);
291
+ backend.lifecycle!.close(win);
292
+ backend.lifecycle!.close(win);
261
293
 
262
294
  expect(native.calls.filter((call) => call.method === 'close')).toHaveLength(0);
263
295
  expect(native.listenerCount('move')).toBe(0);
@@ -267,12 +299,12 @@ describe('createElectronWindowBackend', () => {
267
299
  it('closes a Flight-owned native window exactly once', () => {
268
300
  const { electron } = fakeElectron();
269
301
  const native = new electron.BrowserWindow({}) as unknown as FakeBrowserWindow;
270
- const backend = createElectronWindowBackend(electron);
271
- const win = createApplicationWindow();
272
- expect(backend.attach?.(win, native, 'flight')).toBe(true);
302
+ const backend = electronHostWindow(electron);
303
+ const win = createAppWindow();
304
+ expect(backend.attach!.attach(win, native, 'flight')).toBe(true);
273
305
 
274
- backend.close!(win);
275
- backend.close!(win);
306
+ backend.lifecycle!.close(win);
307
+ backend.lifecycle!.close(win);
276
308
 
277
309
  expect(native.calls.filter((call) => call.method === 'close')).toHaveLength(1);
278
310
  });
@@ -280,40 +312,141 @@ describe('createElectronWindowBackend', () => {
280
312
  it('routes a native close through the application choke point once and drops identity maps', () => {
281
313
  const { electron } = fakeElectron();
282
314
  const native = new electron.BrowserWindow({}) as unknown as FakeBrowserWindow;
283
- const backend = createElectronWindowBackend(electron);
284
- const win = createApplicationWindow();
315
+ const backend = electronHostWindow(electron);
316
+ const win = createAppWindow();
285
317
  let closes = 0;
286
318
  connectSignal(win.onClose, () => closes++);
287
- expect(backend.attach?.(win, native, 'host')).toBe(true);
319
+ expect(backend.attach!.attach(win, native, 'host')).toBe(true);
288
320
 
289
321
  native.fire('closed');
290
322
  native.fire('closed');
291
323
 
292
324
  expect(closes).toBe(1);
293
- expect(getApplicationWindowForElectronId(native.id)).toBeNull();
325
+ expect(getAppWindowForElectronId(native.id)).toBeNull();
294
326
  expect(getElectronBrowserWindow(win)).toBeNull();
295
327
  });
296
328
  });
297
329
 
298
- describe('getApplicationWindowForElectronId', () => {
299
- it('returns the ApplicationWindow for a known Electron id and null for an unknown one', () => {
330
+ describe('electronHostWindowAppearance', () => {
331
+ it('publishes title, icon and opacity hooks', () => {
332
+ expect(Object.keys(electronHostWindowAppearance()).sort()).toEqual(['setIcon', 'setOpacity', 'setTitle']);
333
+ });
334
+ });
335
+
336
+ describe('electronHostWindowAttach', () => {
337
+ it('publishes the attach hook', () => {
338
+ expect(Object.keys(electronHostWindowAttach()).sort()).toEqual(['attach']);
339
+ });
340
+ });
341
+
342
+ describe('electronHostWindowAttention', () => {
343
+ it('publishes both attention hooks', () => {
344
+ expect(Object.keys(electronHostWindowAttention()).sort()).toEqual(['flashWindowFrame', 'requestAttention']);
345
+ });
346
+ });
347
+
348
+ describe('electronHostWindowContentProtection', () => {
349
+ it('publishes the content-protection hook', () => {
350
+ expect(Object.keys(electronHostWindowContentProtection()).sort()).toEqual(['setContentProtection']);
351
+ });
352
+ });
353
+
354
+ describe('electronHostWindowFocus', () => {
355
+ it('publishes the focus hook', () => {
356
+ expect(Object.keys(electronHostWindowFocus()).sort()).toEqual(['focus']);
357
+ });
358
+ });
359
+
360
+ describe('electronHostWindowFullscreen', () => {
361
+ it('publishes the window-fullscreen hook', () => {
362
+ expect(Object.keys(electronHostWindowFullscreen()).sort()).toEqual(['setFullscreen']);
363
+ });
364
+ });
365
+
366
+ describe('electronHostWindowGeometry', () => {
367
+ it('publishes the geometry hooks', () => {
368
+ expect(Object.keys(electronHostWindowGeometry()).sort()).toEqual(['center', 'getBounds', 'setPosition', 'setSize']);
369
+ });
370
+ });
371
+
372
+ describe('electronHostWindowHierarchy', () => {
373
+ it('publishes the parent hook', () => {
374
+ expect(Object.keys(electronHostWindowHierarchy()).sort()).toEqual(['setParent']);
375
+ });
376
+ });
377
+
378
+ describe('electronHostWindowLifecycle', () => {
379
+ it('publishes the open and close hooks', () => {
380
+ const { electron } = fakeElectron();
381
+ expect(Object.keys(electronHostWindowLifecycle(electron)).sort()).toEqual(['close', 'open']);
382
+ });
383
+ });
384
+
385
+ describe('electronHostWindowProgress', () => {
386
+ it('publishes the progress hook', () => {
387
+ expect(Object.keys(electronHostWindowProgress()).sort()).toEqual(['setProgress']);
388
+ });
389
+ });
390
+
391
+ describe('electronHostWindowShadow', () => {
392
+ it('publishes the shadow hook', () => {
393
+ expect(Object.keys(electronHostWindowShadow()).sort()).toEqual(['setHasShadow']);
394
+ });
395
+ });
396
+
397
+ describe('electronHostWindowShell', () => {
398
+ it('publishes both shell hooks', () => {
399
+ expect(Object.keys(electronHostWindowShell()).sort()).toEqual(['setMenuBarVisible', 'setSkipTaskbar']);
400
+ });
401
+ });
402
+
403
+ describe('electronHostWindowSizeConstraints', () => {
404
+ it('publishes the sizing hooks', () => {
405
+ expect(Object.keys(electronHostWindowSizeConstraints()).sort()).toEqual([
406
+ 'setMaximumSize',
407
+ 'setMinimumSize',
408
+ 'setResizable',
409
+ ]);
410
+ });
411
+ });
412
+
413
+ describe('electronHostWindowState', () => {
414
+ it('publishes all three state hooks', () => {
415
+ expect(Object.keys(electronHostWindowState()).sort()).toEqual(['maximize', 'minimize', 'restore']);
416
+ });
417
+ });
418
+
419
+ describe('electronHostWindowVisibility', () => {
420
+ it('publishes the show and hide hooks', () => {
421
+ expect(Object.keys(electronHostWindowVisibility()).sort()).toEqual(['hide', 'show']);
422
+ });
423
+ });
424
+
425
+ describe('electronHostWindowZOrder', () => {
426
+ it('publishes the always-on-top hook', () => {
427
+ expect(Object.keys(electronHostWindowZOrder()).sort()).toEqual(['setAlwaysOnTop']);
428
+ });
429
+ });
430
+
431
+ describe('getAppWindowForElectronId', () => {
432
+ it('returns the AppWindow for a known Electron id and null for an unknown one', () => {
300
433
  const { electron, created } = fakeElectron();
301
- const backend = createElectronWindowBackend(electron);
302
- const win = createApplicationWindow();
303
- backend.open!(win, {});
434
+ const backend = electronHostWindow(electron);
435
+ const win = createAppWindow();
436
+ backend.lifecycle!.open(win, {});
304
437
  const id = created[0].id;
305
- expect(getApplicationWindowForElectronId(id)).toBe(win);
306
- expect(getApplicationWindowForElectronId(9999)).toBeNull();
438
+ expect(getAppWindowForElectronId(id)).toBe(win);
439
+ expect(getAppWindowForElectronId(9999)).toBeNull();
307
440
  });
308
441
  });
309
442
 
310
443
  describe('getElectronBrowserWindow', () => {
311
444
  it('returns the backing BrowserWindow after open and null before', () => {
312
445
  const { electron, created } = fakeElectron();
313
- const backend = createElectronWindowBackend(electron);
314
- const win = createApplicationWindow();
446
+ const backend = electronHostWindow(electron);
447
+ const win = createAppWindow();
315
448
  expect(getElectronBrowserWindow(win)).toBeNull();
316
- backend.open!(win, {});
449
+ backend.lifecycle!.open(win, {});
317
450
  expect(getElectronBrowserWindow(win)).toBe(created[0]);
318
451
  });
319
452
  });
@@ -321,31 +454,26 @@ describe('getElectronBrowserWindow', () => {
321
454
  describe('getElectronWindowId', () => {
322
455
  it('returns the numeric Electron window id after open and -1 before', () => {
323
456
  const { electron, created } = fakeElectron();
324
- const backend = createElectronWindowBackend(electron);
325
- const win = createApplicationWindow();
457
+ const backend = electronHostWindow(electron);
458
+ const win = createAppWindow();
326
459
  expect(getElectronWindowId(win)).toBe(-1);
327
- backend.open!(win, {});
460
+ backend.lifecycle!.open(win, {});
328
461
  const expectedId = created[0].id;
329
462
  expect(getElectronWindowId(win)).toBe(expectedId);
330
463
  });
331
464
  });
332
465
 
333
- describe('initializeElectronWindowBackend', () => {
334
- it('is the construction initializer of createElectronWindowBackend', () => {
335
- expect(typeof initializeElectronWindowBackend).toBe('function');
336
- });
337
- });
338
- describe('resetElectronWindowBackendForTest', () => {
466
+ describe('resetElectronHostWindowForTest', () => {
339
467
  it('clears the window identity maps', () => {
340
468
  const { electron, created } = fakeElectron();
341
- const backend = createElectronWindowBackend(electron);
342
- const win = createApplicationWindow();
343
- expect(backend.open!(win, {})).toBe(true);
469
+ const backend = electronHostWindow(electron);
470
+ const win = createAppWindow();
471
+ expect(backend.lifecycle!.open(win, {})).toBe(true);
344
472
  expect(getElectronBrowserWindow(win)).toBe(created[0]);
345
473
 
346
- resetElectronWindowBackendForTest();
474
+ resetElectronHostWindowForTest();
347
475
 
348
476
  expect(getElectronBrowserWindow(win)).toBeNull();
349
- expect(getApplicationWindowForElectronId(created[0].id)).toBeNull();
477
+ expect(getAppWindowForElectronId(created[0].id)).toBeNull();
350
478
  });
351
479
  });