Skip to content

Commit 89aa8bf

Browse files
author
Matt Bierner
committed
Moving some electron specific webview js back into electron
1 parent c9c29f3 commit 89aa8bf

2 files changed

Lines changed: 57 additions & 51 deletions

File tree

src/vs/workbench/contrib/webview/browser/pre/main.js

Lines changed: 13 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,17 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55
// @ts-check
6+
7+
/**
8+
* @typedef {{
9+
* postMessage: (channel: string, data?: any) => void,
10+
* onMessage: (channel: string, handler: any) => void,
11+
* focusIframeOnCreate?: boolean,
12+
* ready?: Promise<void>,
13+
* onIframeLoaded: (iframe: HTMLIFrameElement) => void
14+
* }} WebviewHost
15+
*/
16+
617
(function () {
718
'use strict';
819

@@ -134,23 +145,13 @@
134145
}
135146

136147
/**
137-
* @typedef {{
138-
* postMessage: (channel: string, data?: any) => void,
139-
* onMessage: (channel: string, handler: any) => void,
140-
* focusIframeOnCreate?: boolean,
141-
* ready?: Promise<void>
142-
* }} HostCommunications
143-
*/
144-
145-
/**
146-
* @param {HostCommunications} host
148+
* @param {WebviewHost} host
147149
*/
148150
function createWebviewManager(host) {
149151
// state
150152
let firstLoad = true;
151153
let loadTimeout;
152154
let pendingMessages = [];
153-
let isInDevelopmentMode = false;
154155

155156
const initData = {
156157
initialScrollProgress: undefined
@@ -442,44 +443,10 @@
442443
}
443444
});
444445

445-
if (!FAKE_LOAD) {
446-
newFrame.contentWindow.onbeforeunload = () => {
447-
if (isInDevelopmentMode) { // Allow reloads while developing a webview
448-
host.postMessage('do-reload');
449-
return false;
450-
}
451-
452-
// Block navigation when not in development mode
453-
console.log('prevented webview navigation');
454-
return false;
455-
};
456-
}
457-
458446
// Bubble out link clicks
459447
newFrame.contentWindow.addEventListener('click', handleInnerClick);
460448

461-
// Electron 4 eats mouseup events from inside webviews
462-
// https://github.com/microsoft/vscode/issues/75090
463-
// Try to fix this by rebroadcasting mouse moves and mouseups so that we can
464-
// emulate these on the main window
465-
if (!FAKE_LOAD) {
466-
let isMouseDown = false;
467-
468-
newFrame.contentWindow.addEventListener('mousedown', () => {
469-
isMouseDown = true;
470-
});
471-
472-
const tryDispatchSyntheticMouseEvent = (e) => {
473-
if (!isMouseDown) {
474-
host.postMessage('synthetic-mouse-event', { type: e.type, screenX: e.screenX, screenY: e.screenY, clientX: e.clientX, clientY: e.clientY });
475-
}
476-
};
477-
newFrame.contentWindow.addEventListener('mouseup', e => {
478-
tryDispatchSyntheticMouseEvent(e);
479-
isMouseDown = false;
480-
});
481-
newFrame.contentWindow.addEventListener('mousemove', tryDispatchSyntheticMouseEvent);
482-
}
449+
host.onIframeLoaded(newFrame);
483450
}
484451

485452
if (!FAKE_LOAD) {
@@ -511,9 +478,6 @@
511478
initData.initialScrollProgress = progress;
512479
});
513480

514-
host.onMessage('devtools-opened', () => {
515-
isInDevelopmentMode = true;
516-
});
517481

518482
trackFocus({
519483
onFocus: () => host.postMessage('did-focus'),

src/vs/workbench/contrib/webview/electron-browser/pre/electron-index.js

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,54 @@
2828
// @ts-ignore
2929
const ipcRenderer = require('electron').ipcRenderer;
3030

31-
require('../../browser/pre/main')({
31+
let isInDevelopmentMode = false;
32+
33+
/**
34+
* @type {import('../../browser/pre/main').WebviewHost}
35+
*/
36+
const host = {
3237
postMessage: (channel, data) => {
3338
ipcRenderer.sendToHost(channel, data);
3439
},
3540
onMessage: (channel, handler) => {
3641
ipcRenderer.on(channel, handler);
3742
},
38-
focusIframeOnCreate: true
43+
focusIframeOnCreate: true,
44+
onIframeLoaded: (newFrame) => {
45+
newFrame.contentWindow.onbeforeunload = () => {
46+
if (isInDevelopmentMode) { // Allow reloads while developing a webview
47+
host.postMessage('do-reload');
48+
return false;
49+
}
50+
// Block navigation when not in development mode
51+
console.log('prevented webview navigation');
52+
return false;
53+
};
54+
55+
// Electron 4 eats mouseup events from inside webviews
56+
// https://github.com/microsoft/vscode/issues/75090
57+
// Try to fix this by rebroadcasting mouse moves and mouseups so that we can
58+
// emulate these on the main window
59+
let isMouseDown = false;
60+
newFrame.contentWindow.addEventListener('mousedown', () => {
61+
isMouseDown = true;
62+
});
63+
64+
const tryDispatchSyntheticMouseEvent = (e) => {
65+
if (!isMouseDown) {
66+
host.postMessage('synthetic-mouse-event', { type: e.type, screenX: e.screenX, screenY: e.screenY, clientX: e.clientX, clientY: e.clientY });
67+
}
68+
};
69+
newFrame.contentWindow.addEventListener('mouseup', e => {
70+
tryDispatchSyntheticMouseEvent(e);
71+
isMouseDown = false;
72+
});
73+
newFrame.contentWindow.addEventListener('mousemove', tryDispatchSyntheticMouseEvent);
74+
}
75+
};
76+
77+
host.onMessage('devtools-opened', () => {
78+
isInDevelopmentMode = true;
3979
});
4080

4181
document.addEventListener('DOMContentLoaded', () => {
@@ -46,4 +86,6 @@
4686
ipcRenderer.sendToHost(message.data.command, message.data.data);
4787
};
4888
});
89+
90+
require('../../browser/pre/main')(host);
4991
}());

0 commit comments

Comments
 (0)