Skip to content

Commit e9c330b

Browse files
Merge pull request #200 from austinjang2/ajangg1.8
Update SHA for CSP and remove unused patch files (base-path and tar-fs-upgrade)
2 parents 51599db + 5b9e7b8 commit e9c330b

File tree

5 files changed

+98
-325
lines changed

5 files changed

+98
-325
lines changed

patched-vscode/src/vs/workbench/contrib/webview/browser/pre/index.html

Lines changed: 56 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<meta charset="UTF-8">
66

77
<meta http-equiv="Content-Security-Policy"
8-
content="default-src 'none'; script-src 'sha256-R3BsSkqy7qFbvWSmwr7WqT1eg6Sq4zSe0uIlrUQ4EKE=' 'self'; frame-src 'self'; style-src 'unsafe-inline';">
8+
content="default-src 'none'; script-src 'sha256-1qYtPnTQa4VwKNJO61EOhs2agF9TvuQSYIJ27OgzZqI=' 'self'; frame-src 'self'; style-src 'unsafe-inline';">
99

1010
<!-- Disable pinch zooming -->
1111
<meta name="viewport"
@@ -35,6 +35,8 @@
3535
const onElectron = searchParams.get('platform') === 'electron';
3636
const disableServiceWorker = searchParams.has('disableServiceWorker');
3737
const expectedWorkerVersion = parseInt(searchParams.get('swVersion'));
38+
/** @type {MessageChannel | undefined} */
39+
let outerIframeMessageChannel;
3840

3941
/**
4042
* Use polling to track focus of main webview and iframes within the webview
@@ -110,6 +112,10 @@
110112
color: var(--vscode-textLink-foreground);
111113
}
112114
115+
p > a {
116+
text-decoration: var(--text-link-decoration);
117+
}
118+
113119
a:hover {
114120
color: var(--vscode-textLink-activeForeground);
115121
}
@@ -232,7 +238,7 @@
232238
}
233239

234240
const swPath = encodeURI(`service-worker.js?v=${expectedWorkerVersion}&vscode-resource-base-authority=${searchParams.get('vscode-resource-base-authority')}&remoteAuthority=${searchParams.get('remoteAuthority') ?? ''}`);
235-
navigator.serviceWorker.register(swPath)
241+
navigator.serviceWorker.register(swPath, { type: 'module' })
236242
.then(async registration => {
237243
/**
238244
* @param {MessageEvent} event
@@ -260,7 +266,8 @@
260266
navigator.serviceWorker.addEventListener('message', versionHandler);
261267

262268
const postVersionMessage = (/** @type {ServiceWorker} */ controller) => {
263-
controller.postMessage({ channel: 'version' });
269+
outerIframeMessageChannel = new MessageChannel();
270+
controller.postMessage({ channel: 'version' }, [outerIframeMessageChannel.port2]);
264271
};
265272

266273
// At this point, either the service worker is ready and
@@ -797,6 +804,32 @@
797804
}
798805
}
799806

807+
808+
function handleInnerDragEvent(/** @type {DragEvent} */ e) {
809+
/**
810+
* To ensure that the drop event always fires as expected, you should always include a preventDefault() call in the part of your code which handles the dragover event.
811+
* source: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/drop_event
812+
**/
813+
e.preventDefault();
814+
815+
if (!e.dataTransfer) {
816+
return;
817+
}
818+
819+
820+
// Only handle drags from outside editor for now
821+
if (e.dataTransfer.items.length && Array.prototype.every.call(e.dataTransfer.items, item => item.kind === 'file')) {
822+
hostMessaging.postMessage('drag', {
823+
shiftKey: e.shiftKey
824+
});
825+
}
826+
827+
}
828+
829+
function handleInnerDropEvent(/**@type {DragEvent} */e) {
830+
e.preventDefault();
831+
}
832+
800833
/**
801834
* @param {() => void} callback
802835
*/
@@ -887,7 +920,10 @@
887920
window.addEventListener('keydown', handleInnerKeydown);
888921
window.addEventListener('keyup', handleInnerKeyup);
889922
window.addEventListener('dragenter', handleInnerDragStartEvent);
890-
window.addEventListener('dragover', handleInnerDragStartEvent);
923+
window.addEventListener('dragover', handleInnerDragEvent);
924+
window.addEventListener('drag', handleInnerDragEvent);
925+
window.addEventListener('drop', handleInnerDropEvent);
926+
891927

892928
onDomReady(() => {
893929
if (!document.body) {
@@ -980,7 +1016,7 @@
9801016
const previousPendingFrame = getPendingFrame();
9811017
if (previousPendingFrame) {
9821018
previousPendingFrame.setAttribute('id', '');
983-
document.body.removeChild(previousPendingFrame);
1019+
previousPendingFrame.remove();
9841020
}
9851021
if (!wasFirstLoad) {
9861022
pendingMessages = [];
@@ -1077,9 +1113,7 @@
10771113
if (newFrame && newFrame.contentDocument && newFrame.contentDocument === contentDocument) {
10781114
const wasFocused = document.hasFocus();
10791115
const oldActiveFrame = getActiveFrame();
1080-
if (oldActiveFrame) {
1081-
document.body.removeChild(oldActiveFrame);
1082-
}
1116+
oldActiveFrame?.remove();
10831117
// Styles may have changed since we created the element. Make sure we re-style
10841118
if (initialStyleVersion !== styleVersion) {
10851119
applyStyles(newFrame.contentDocument, newFrame.contentDocument.body);
@@ -1171,10 +1205,23 @@
11711205
});
11721206

11731207
contentWindow.addEventListener('dragenter', handleInnerDragStartEvent);
1174-
contentWindow.addEventListener('dragover', handleInnerDragStartEvent);
1208+
contentWindow.addEventListener('dragover', handleInnerDragEvent);
1209+
contentWindow.addEventListener('drag', handleInnerDragEvent);
1210+
contentWindow.addEventListener('drop', handleInnerDropEvent);
11751211

11761212
unloadMonitor.onIframeLoaded(newFrame);
11771213
}
1214+
1215+
if (!disableServiceWorker && outerIframeMessageChannel) {
1216+
outerIframeMessageChannel.port1.onmessage = event => {
1217+
switch (event.data.channel) {
1218+
case 'load-resource':
1219+
case 'load-localhost':
1220+
hostMessaging.postMessage(event.data.channel, event.data);
1221+
return;
1222+
}
1223+
};
1224+
}
11781225
});
11791226

11801227
// propagate vscode-context-menu-visible class

patched-vscode/src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,17 @@
44
<meta http-equiv="Content-Security-Policy" content="
55
default-src 'none';
66
child-src 'self' data: blob:;
7-
script-src 'self' 'unsafe-eval' 'sha256-c7vPrYRaSLDtFSrI4CuHYgBQ3a4c4x2LSm/LefSZADQ=' https:;
7+
script-src 'self' 'unsafe-eval' 'sha256-yhZXuB8LS6t73dvNg6rtLX8y4PHLnqRm5+6DdOGkOcw=' https:;
88
connect-src 'self' https: wss: http://localhost:* http://127.0.0.1:* ws://localhost:* ws://127.0.0.1:*;"/>
99
</head>
1010
<body>
1111
<script>
1212
(function () {
1313
const searchParams = new URL(document.location.href).searchParams;
1414
const vscodeWebWorkerExtHostId = searchParams.get('vscodeWebWorkerExtHostId') || '';
15-
const name = searchParams.get('debugged') ? 'DebugWorkerExtensionHost' : 'WorkerExtensionHost';
15+
// DO NOT CHANGE the name of the worker without also updating js-debug, as that
16+
// is used to filter targets to attach to (e.g. #232544)
17+
const name = searchParams.get('debugged') ? 'DebugExtensionHostWorker' : 'ExtensionHostWorker';
1618
const parentOrigin = searchParams.get('parentOrigin') || window.origin;
1719
const salt = searchParams.get('salt');
1820

@@ -73,14 +75,47 @@
7375
}
7476

7577
function start() {
78+
79+
// Before we can load the worker, we need to get the current set of NLS
80+
// configuration into this iframe. We ask the parent window to send it
81+
// together with the necessary information to load the worker via Blob.
82+
83+
const bootstrapNlsType = 'vscode.bootstrap.nls';
84+
85+
self.onmessage = (event) => {
86+
if (event.origin !== parentOrigin || event.data.type !== bootstrapNlsType) {
87+
return;
88+
}
89+
const { data } = event.data;
90+
createWorker(data.workerUrl, data.fileRoot, data.nls.messages, data.nls.language);
91+
};
92+
93+
window.parent.postMessage({
94+
vscodeWebWorkerExtHostId,
95+
type: bootstrapNlsType
96+
}, '*');
97+
}
98+
99+
function createWorker(workerUrl, fileRoot, nlsMessages, nlsLanguage) {
76100
try {
77-
let workerUrl = '../../../../base/worker/workerMain.js';
78101
if (globalThis.crossOriginIsolated) {
79102
workerUrl += '?vscode-coi=2'; // COEP
80103
}
81104

82-
const worker = new Worker(workerUrl, { name });
83-
worker.postMessage('vs/workbench/api/worker/extensionHostWorker');
105+
// In below blob code, we are using JSON.stringify to ensure the passed
106+
// in values are not breaking our script. The values may contain string
107+
// terminating characters (such as ' or ").
108+
109+
const blob = new Blob([[
110+
`/*extensionHostWorker*/`,
111+
`globalThis._VSCODE_NLS_MESSAGES = ${JSON.stringify(nlsMessages)};`,
112+
`globalThis._VSCODE_NLS_LANGUAGE = ${JSON.stringify(nlsLanguage)};`,
113+
`globalThis._VSCODE_FILE_ROOT = ${JSON.stringify(fileRoot)};`,
114+
`await import(${JSON.stringify(workerUrl)});`,
115+
`/*extensionHostWorker*/`
116+
].join('')], { type: 'application/javascript' });
117+
118+
const worker = new Worker(URL.createObjectURL(blob), { name, type: 'module' });
84119
const nestedWorkers = new Map();
85120

86121
worker.onmessage = (event) => {

0 commit comments

Comments
 (0)