Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
784c1dad
V
vscode
项目概览
xxadev
/
vscode
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
784c1dad
编写于
9月 07, 2020
作者:
J
Johannes Rieken
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
use MessageChannel api to communicate between worker extension host and main thread
上级
6b45e457
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
56 addition
and
29 deletion
+56
-29
src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts
...nch/services/extensions/browser/webWorkerExtensionHost.ts
+45
-11
src/vs/workbench/services/extensions/common/webWorkerIframe.ts
...s/workbench/services/extensions/common/webWorkerIframe.ts
+3
-13
src/vs/workbench/services/extensions/worker/extensionHostWorker.ts
...rkbench/services/extensions/worker/extensionHostWorker.ts
+8
-5
未找到文件。
src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts
浏览文件 @
784c1dad
...
...
@@ -28,6 +28,7 @@ import { localize } from 'vs/nls';
import
{
generateUuid
}
from
'
vs/base/common/uuid
'
;
import
{
canceled
,
onUnexpectedError
}
from
'
vs/base/common/errors
'
;
import
{
WEB_WORKER_IFRAME
}
from
'
vs/workbench/services/extensions/common/webWorkerIframe
'
;
import
{
Barrier
}
from
'
vs/base/common/async
'
;
export
interface
IWebWorkerExtensionHostInitData
{
readonly
autoStart
:
boolean
;
...
...
@@ -82,7 +83,7 @@ export class WebWorkerExtensionHost extends Disposable implements IExtensionHost
return
this
.
_protocolPromise
;
}
private
_startInsideIframe
():
Promise
<
IMessagePassingProtocol
>
{
private
async
_startInsideIframe
():
Promise
<
IMessagePassingProtocol
>
{
const
emitter
=
this
.
_register
(
new
Emitter
<
VSBuffer
>
());
const
iframe
=
document
.
createElement
(
'
iframe
'
);
...
...
@@ -111,6 +112,9 @@ export class WebWorkerExtensionHost extends Disposable implements IExtensionHost
const
iframeContent
=
`data:text/html;charset=utf-8,
${
encodeURIComponent
(
html
)}
`
;
iframe
.
setAttribute
(
'
src
'
,
iframeContent
);
const
barrier
=
new
Barrier
();
let
port
!
:
MessagePort
;
this
.
_register
(
dom
.
addDisposableListener
(
window
,
'
message
'
,
(
event
)
=>
{
if
(
event
.
source
!==
iframe
.
contentWindow
)
{
return
;
...
...
@@ -129,38 +133,68 @@ export class WebWorkerExtensionHost extends Disposable implements IExtensionHost
return
;
}
const
{
data
}
=
event
.
data
;
if
(
barrier
.
isOpen
()
||
!
(
data
instanceof
MessagePort
))
{
console
.
warn
(
'
UNEXPECTED message
'
,
event
);
this
.
_onDidExit
.
fire
([
81
,
'
UNEXPECTED message
'
]);
return
;
}
port
=
data
;
barrier
.
open
();
}));
document
.
body
.
appendChild
(
iframe
);
this
.
_register
(
toDisposable
(()
=>
iframe
.
remove
()));
// await MessagePort and use it to directly communicate
// with the worker extension host
await
barrier
.
wait
();
port
.
onmessage
=
(
event
)
=>
{
const
{
data
}
=
event
;
if
(
!
(
data
instanceof
ArrayBuffer
))
{
console
.
warn
(
'
UNKNOWN data received
'
,
data
);
this
.
_onDidExit
.
fire
([
77
,
'
UNKNOWN data received
'
]);
return
;
}
emitter
.
fire
(
VSBuffer
.
wrap
(
new
Uint8Array
(
data
,
0
,
data
.
byteLength
)));
}
))
;
};
const
protocol
:
IMessagePassingProtocol
=
{
onMessage
:
emitter
.
event
,
send
:
vsbuf
=>
{
const
data
=
vsbuf
.
buffer
.
buffer
.
slice
(
vsbuf
.
buffer
.
byteOffset
,
vsbuf
.
buffer
.
byteOffset
+
vsbuf
.
buffer
.
byteLength
);
iframe
.
contentWindow
!
.
postMessage
({
vscodeWebWorkerExtHostId
,
data
:
data
},
'
*
'
,
[
data
]);
port
.
postMessage
(
data
,
[
data
]);
}
};
document
.
body
.
appendChild
(
iframe
);
this
.
_register
(
toDisposable
(()
=>
iframe
.
remove
()));
return
this
.
_performHandshake
(
protocol
);
}
private
_startOutsideIframe
():
Promise
<
IMessagePassingProtocol
>
{
private
async
_startOutsideIframe
():
Promise
<
IMessagePassingProtocol
>
{
const
emitter
=
new
Emitter
<
VSBuffer
>
();
const
url
=
getWorkerBootstrapUrl
(
require
.
toUrl
(
'
../worker/extensionHostWorkerMain.js
'
),
'
WorkerExtensionHost
'
);
const
worker
=
new
Worker
(
url
,
{
name
:
'
WorkerExtensionHost
'
});
const
barrier
=
new
Barrier
();
let
port
!
:
MessagePort
;
worker
.
onmessage
=
(
event
)
=>
{
const
{
data
}
=
event
;
if
(
barrier
.
isOpen
()
||
!
(
data
instanceof
MessagePort
))
{
console
.
warn
(
'
UNEXPECTED message
'
,
event
);
this
.
_onDidExit
.
fire
([
81
,
'
UNEXPECTED message
'
]);
return
;
}
port
=
data
;
barrier
.
open
();
};
// await MessagePort and use it to directly communicate
// with the worker extension host
await
barrier
.
wait
();
port
.
onmessage
=
(
event
)
=>
{
const
{
data
}
=
event
;
if
(
!
(
data
instanceof
ArrayBuffer
))
{
console
.
warn
(
'
UNKNOWN data received
'
,
data
);
...
...
@@ -184,7 +218,7 @@ export class WebWorkerExtensionHost extends Disposable implements IExtensionHost
onMessage
:
emitter
.
event
,
send
:
vsbuf
=>
{
const
data
=
vsbuf
.
buffer
.
buffer
.
slice
(
vsbuf
.
buffer
.
byteOffset
,
vsbuf
.
buffer
.
byteOffset
+
vsbuf
.
buffer
.
byteLength
);
worker
.
postMessage
(
data
,
[
data
]);
port
.
postMessage
(
data
,
[
data
]);
}
};
...
...
src/vs/workbench/services/extensions/common/webWorkerIframe.ts
浏览文件 @
784c1dad
...
...
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
export
const
WEB_WORKER_IFRAME
=
{
sha
:
'
sha256-r
SINb5Ths99Zj4Ml59jEdHS4WbO+H5Iw+oyRmyi2MLw
=
'
,
sha
:
'
sha256-r
24mDVsMuFEo8ChaY9ppVJKbY3CUM4I12Aw/yscWZbg
=
'
,
js
:
`
(function() {
const workerSrc = document.getElementById('vscode-worker-src').getAttribute('data-value');
...
...
@@ -13,8 +13,8 @@ export const WEB_WORKER_IFRAME = {
worker.onmessage = (event) => {
const { data } = event;
if (!(data instanceof
ArrayBuffer
)) {
console.warn('Unknown data received',
data
);
if (!(data instanceof
MessagePort
)) {
console.warn('Unknown data received',
event
);
window.parent.postMessage({
vscodeWebWorkerExtHostId,
error: {
...
...
@@ -42,16 +42,6 @@ export const WEB_WORKER_IFRAME = {
}
}, '*');
};
window.addEventListener('message', function(event) {
if (event.source !== window.parent) {
return;
}
if (event.data.vscodeWebWorkerExtHostId !== vscodeWebWorkerExtHostId) {
return;
}
worker.postMessage(event.data.data, [event.data.data]);
}, false);
})();
`
};
src/vs/workbench/services/extensions/worker/extensionHostWorker.ts
浏览文件 @
784c1dad
...
...
@@ -33,7 +33,7 @@ self.close = () => console.trace(`'close' has been blocked`);
const
nativePostMessage
=
postMessage
.
bind
(
self
);
self
.
postMessage
=
()
=>
console
.
trace
(
`'postMessage' has been blocked`
);
const
nativeAddEventLister
=
addEventListener
.
bind
(
self
);
//
const nativeAddEventLister = addEventListener.bind(self);
self
.
addEventLister
=
()
=>
console
.
trace
(
`'addEventListener' has been blocked`
);
(
<
any
>
self
)[
'
AMDLoader
'
]
=
undefined
;
...
...
@@ -79,11 +79,14 @@ class ExtensionWorker {
constructor
()
{
let
emitter
=
new
Emitter
<
VSBuffer
>
();
const
channel
=
new
MessageChannel
();
const
emitter
=
new
Emitter
<
VSBuffer
>
();
let
terminating
=
false
;
// send over port2, keep port1
nativePostMessage
(
channel
.
port2
,
[
channel
.
port2
]);
nativeAddEventLister
(
'
message
'
,
event
=>
{
channel
.
port1
.
onmessage
=
event
=>
{
const
{
data
}
=
event
;
if
(
!
(
data
instanceof
ArrayBuffer
))
{
console
.
warn
(
'
UNKNOWN data received
'
,
data
);
...
...
@@ -100,14 +103,14 @@ class ExtensionWorker {
// emit non-terminate messages to the outside
emitter
.
fire
(
msg
);
}
)
;
};
this
.
protocol
=
{
onMessage
:
emitter
.
event
,
send
:
vsbuf
=>
{
if
(
!
terminating
)
{
const
data
=
vsbuf
.
buffer
.
buffer
.
slice
(
vsbuf
.
buffer
.
byteOffset
,
vsbuf
.
buffer
.
byteOffset
+
vsbuf
.
buffer
.
byteLength
);
nativeP
ostMessage
(
data
,
[
data
]);
channel
.
port1
.
p
ostMessage
(
data
,
[
data
]);
}
}
};
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录