66import { FindInPageOptions , OnBeforeRequestListenerDetails , OnHeadersReceivedListenerDetails , Response , WebContents , WebviewTag } from 'electron' ;
77import { ipcRenderer } from 'vs/base/parts/sandbox/electron-sandbox/globals' ;
88import { addDisposableListener } from 'vs/base/browser/dom' ;
9+ import { equals } from 'vs/base/common/arrays' ;
910import { ThrottledDelayer } from 'vs/base/common/async' ;
1011import { Emitter , Event } from 'vs/base/common/event' ;
1112import { once } from 'vs/base/common/functional' ;
@@ -26,8 +27,9 @@ import { WebviewPortMappingManager } from 'vs/workbench/contrib/webview/common/p
2627import { WebviewThemeDataProvider } from 'vs/workbench/contrib/webview/common/themeing' ;
2728import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService' ;
2829import { WebviewFindDelegate , WebviewFindWidget } from '../browser/webviewFindWidget' ;
29- import { equals } from 'vs/base/common/arrays' ;
30-
30+ import { IWebviewManagerService } from 'vs/platform/webview/common/webviewManagerService' ;
31+ import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService' ;
32+ import { createChannelSender } from 'vs/base/parts/ipc/common/ipc' ;
3133
3234class WebviewTagHandle extends Disposable {
3335
@@ -185,26 +187,30 @@ class WebviewPortMappingProvider extends Disposable {
185187
186188class WebviewKeyboardHandler {
187189
188- private readonly _webviews = new Set < WebviewTagHandle > ( ) ;
190+ private readonly _webviews = new Set < WebviewTag > ( ) ;
189191 private readonly _isUsingNativeTitleBars : boolean ;
190192
191- constructor ( configurationService : IConfigurationService ) {
193+ private readonly webviewMainService : IWebviewManagerService ;
194+
195+ constructor (
196+ configurationService : IConfigurationService ,
197+ mainProcessService : IMainProcessService ,
198+ ) {
192199 this . _isUsingNativeTitleBars = configurationService . getValue < string > ( 'window.titleBarStyle' ) === 'native' ;
200+
201+ this . webviewMainService = createChannelSender < IWebviewManagerService > ( mainProcessService . getChannel ( 'webview' ) ) ;
193202 }
194203
195- public add (
196- webviewHandle : WebviewTagHandle ,
197- ) : IDisposable {
198- this . _webviews . add ( webviewHandle ) ;
204+ public add ( webview : WebviewTag ) : IDisposable {
205+ this . _webviews . add ( webview ) ;
199206
200207 const disposables = new DisposableStore ( ) ;
208+
201209 if ( this . shouldToggleMenuShortcutsEnablement ) {
202- disposables . add ( webviewHandle . onFirstLoad ( ( ) => {
203- this . setIgnoreMenuShortcutsForWebview ( webviewHandle , true ) ;
204- } ) ) ;
210+ this . setIgnoreMenuShortcutsForWebview ( webview , true ) ;
205211 }
206212
207- disposables . add ( addDisposableListener ( webviewHandle . webview , 'ipc-message' , ( event ) => {
213+ disposables . add ( addDisposableListener ( webview , 'ipc-message' , ( event ) => {
208214 switch ( event . channel ) {
209215 case 'did-focus' :
210216 this . setIgnoreMenuShortcuts ( true ) ;
@@ -218,7 +224,7 @@ class WebviewKeyboardHandler {
218224
219225 return toDisposable ( ( ) => {
220226 disposables . dispose ( ) ;
221- this . _webviews . delete ( webviewHandle ) ;
227+ this . _webviews . delete ( webview ) ;
222228 } ) ;
223229 }
224230
@@ -232,12 +238,9 @@ class WebviewKeyboardHandler {
232238 }
233239 }
234240
235- private setIgnoreMenuShortcutsForWebview ( webview : WebviewTagHandle , value : boolean ) {
241+ private setIgnoreMenuShortcutsForWebview ( webview : WebviewTag , value : boolean ) {
236242 if ( this . shouldToggleMenuShortcutsEnablement ) {
237- const contents = webview . webContents ;
238- if ( ! contents ?. isDestroyed ( ) ) {
239- contents ?. setIgnoreMenuShortcuts ( value ) ;
240- }
243+ this . webviewMainService . setIgnoreMenuShortcuts ( webview . getWebContentsId ( ) , value ) ;
241244 }
242245 }
243246}
@@ -246,9 +249,12 @@ export class ElectronWebviewBasedWebview extends BaseWebview<WebviewTag> impleme
246249
247250 private static _webviewKeyboardHandler : WebviewKeyboardHandler | undefined ;
248251
249- private static getWebviewKeyboardHandler ( configService : IConfigurationService ) {
252+ private static getWebviewKeyboardHandler (
253+ configService : IConfigurationService ,
254+ mainProcessService : IMainProcessService ,
255+ ) {
250256 if ( ! this . _webviewKeyboardHandler ) {
251- this . _webviewKeyboardHandler = new WebviewKeyboardHandler ( configService ) ;
257+ this . _webviewKeyboardHandler = new WebviewKeyboardHandler ( configService , mainProcessService ) ;
252258 }
253259 return this . _webviewKeyboardHandler ;
254260 }
@@ -276,6 +282,7 @@ export class ElectronWebviewBasedWebview extends BaseWebview<WebviewTag> impleme
276282 @IEnvironmentService environementService : IEnvironmentService ,
277283 @IWorkbenchEnvironmentService workbenchEnvironmentService : IWorkbenchEnvironmentService ,
278284 @IConfigurationService configurationService : IConfigurationService ,
285+ @IMainProcessService mainProcessService : IMainProcessService ,
279286 ) {
280287 super ( id , options , contentOptions , extension , _webviewThemeDataProvider , telemetryService , environementService , workbenchEnvironmentService ) ;
281288
@@ -291,7 +298,9 @@ export class ElectronWebviewBasedWebview extends BaseWebview<WebviewTag> impleme
291298 tunnelService ,
292299 ) ) ;
293300
294- this . _register ( ElectronWebviewBasedWebview . getWebviewKeyboardHandler ( configurationService ) . add ( webviewAndContents ) ) ;
301+ this . _register ( addDisposableListener ( this . element ! , 'did-start-loading' , once ( ( ) => {
302+ this . _register ( ElectronWebviewBasedWebview . getWebviewKeyboardHandler ( configurationService , mainProcessService ) . add ( this . element ! ) ) ;
303+ } ) ) ) ;
295304
296305 this . _domReady = new Promise ( resolve => {
297306 const subscription = this . _register ( this . on ( WebviewMessageChannels . webviewReady , ( ) => {
0 commit comments