@@ -3,7 +3,7 @@ import { EventEmitter } from 'events'
3
3
import { nanoid } from 'nanoid'
4
4
import puppeteer from 'puppeteer-core'
5
5
import TypedEmitter from 'typed-emitter'
6
- import favicon from './assets/favicon .png'
6
+ import macDockIcon from './assets/mac-dock-icon .png'
7
7
import { ConvertType , mimeTypes } from './converter'
8
8
import { error } from './error'
9
9
import { File , FileType } from './file'
@@ -27,6 +27,12 @@ export namespace Preview {
27
27
height : number
28
28
width : number
29
29
}
30
+
31
+ export interface Window extends EventEmitter {
32
+ page : puppeteer . Page
33
+ close : ( ) => Promise < void >
34
+ load : ( uri : string ) => Promise < void >
35
+ }
30
36
}
31
37
32
38
export class Preview extends ( EventEmitter as new ( ) => TypedEmitter < Preview . Events > ) {
@@ -67,7 +73,7 @@ export class Preview extends (EventEmitter as new () => TypedEmitter<Preview.Eve
67
73
}
68
74
}
69
75
70
- private createWindowObject ( page : puppeteer . Page ) {
76
+ private createWindowObject ( page : puppeteer . Page ) : Preview . Window {
71
77
const window = new EventEmitter ( )
72
78
73
79
page . on ( 'close' , async ( ) => window . emit ( 'close' ) )
@@ -77,7 +83,7 @@ export class Preview extends (EventEmitter as new () => TypedEmitter<Preview.Eve
77
83
close : async ( ) => {
78
84
try {
79
85
return await page . close ( )
80
- } catch ( e ) {
86
+ } catch ( e : any ) {
81
87
// Ignore raising error if a target page has already close
82
88
/* istanbul ignore next */
83
89
if ( ! e . message . includes ( 'Target closed.' ) ) throw e
@@ -133,7 +139,7 @@ export class Preview extends (EventEmitter as new () => TypedEmitter<Preview.Eve
133
139
}
134
140
}
135
141
136
- private async launch ( ) {
142
+ private async launch ( ) : Promise < Preview . Window > {
137
143
const baseArgs = generatePuppeteerLaunchArgs ( )
138
144
139
145
this . puppeteerInternal = await launchPuppeteer ( {
@@ -150,13 +156,13 @@ export class Preview extends (EventEmitter as new () => TypedEmitter<Preview.Eve
150
156
} ) ,
151
157
} )
152
158
153
- // Set Marp icon asynchrnously
159
+ // Set Marp icon asynchrnously (only for macOS)
154
160
this . puppeteerInternal
155
161
. target ( )
156
162
. createCDPSession ( )
157
163
. then ( ( session ) => {
158
164
session
159
- . send ( 'Browser.setDockTile' , { image : favicon . slice ( 22 ) } )
165
+ . send ( 'Browser.setDockTile' , { image : macDockIcon . slice ( 22 ) } )
160
166
. catch ( ( ) => {
161
167
// No ops
162
168
} )
@@ -173,11 +179,20 @@ export class Preview extends (EventEmitter as new () => TypedEmitter<Preview.Eve
173
179
} )
174
180
175
181
const [ page ] = await this . puppeteerInternal . pages ( )
176
- page . on ( 'close' , handlePageOnClose )
177
182
183
+ let windowObject : Preview . Window | undefined
184
+
185
+ /* istanbul ignore next */
186
+ if ( process . platform === 'darwin' ) {
187
+ // An initial app window is not using in macOS for correct handling activation from Dock
188
+ windowObject = ( await this . createWindow ( ) ) || undefined
189
+ await page . close ( )
190
+ }
191
+
192
+ page . on ( 'close' , handlePageOnClose )
178
193
this . emit ( 'launch' )
179
194
180
- return this . createWindowObject ( page )
195
+ return windowObject || this . createWindowObject ( page )
181
196
}
182
197
}
183
198
0 commit comments