Skip to content

Commit 39971e0

Browse files
committed
adding new custom drag event handler to allow event bubbling
1 parent 4f5d9e8 commit 39971e0

File tree

1 file changed

+16
-1
lines changed

1 file changed

+16
-1
lines changed

src/vs/workbench/contrib/webview/browser/webviewElement.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import { loadLocalResource, WebviewResourceResponse } from 'vs/workbench/contrib
3434
import { WebviewThemeDataProvider } from 'vs/workbench/contrib/webview/browser/themeing';
3535
import { areWebviewContentOptionsEqual, IWebview, WebviewContentOptions, WebviewExtensionDescription, WebviewInitInfo, WebviewMessageReceivedEvent, WebviewOptions } from 'vs/workbench/contrib/webview/browser/webview';
3636
import { WebviewFindDelegate, WebviewFindWidget } from 'vs/workbench/contrib/webview/browser/webviewFindWidget';
37-
import { FromWebviewMessage, KeyEvent, ToWebviewMessage } from 'vs/workbench/contrib/webview/browser/webviewMessages';
37+
import { DragEvent, FromWebviewMessage, KeyEvent, ToWebviewMessage } from 'vs/workbench/contrib/webview/browser/webviewMessages';
3838
import { decodeAuthority, webviewGenericCspSource, webviewRootResourceAuthority } from 'vs/workbench/contrib/webview/common/webview';
3939
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';
4040
import { CodeWindow } from 'vs/base/browser/window';
@@ -310,6 +310,10 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD
310310
this._startBlockingIframeDragEvents();
311311
}));
312312

313+
this._register(this.on('drag', (event) => {
314+
this.handleDragEvent('drag', event);
315+
}));
316+
313317
if (initInfo.options.enableFindWidget) {
314318
this._webviewFindWidget = this._register(instantiationService.createInstance(WebviewFindWidget, this));
315319
}
@@ -697,6 +701,17 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD
697701
this.window?.dispatchEvent(emulatedKeyboardEvent);
698702
}
699703

704+
private handleDragEvent(type: 'drag', event: DragEvent) {
705+
// Create a fake KeyboardEvent from the data provided
706+
const emulatedDragEvent = new DragEvent(type, event);
707+
// Force override the target
708+
Object.defineProperty(emulatedDragEvent, 'target', {
709+
get: () => this.element,
710+
});
711+
// And re-dispatch
712+
this.window?.dispatchEvent(emulatedDragEvent);
713+
}
714+
700715
windowDidDragStart(): void {
701716
// Webview break drag and dropping around the main window (no events are generated when you are over them)
702717
// Work around this by disabling pointer events during the drag.

0 commit comments

Comments
 (0)