Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
2024296a
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,发现更多精彩内容 >>
提交
2024296a
编写于
6月 07, 2019
作者:
J
Johannes Rieken
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
first cut/experiment of icon/resouce loading, #75061
上级
d941578c
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
103 addition
and
1 deletion
+103
-1
src/vs/workbench/browser/web.main.ts
src/vs/workbench/browser/web.main.ts
+5
-1
src/vs/workbench/browser/web.resources.ts
src/vs/workbench/browser/web.resources.ts
+98
-0
未找到文件。
src/vs/workbench/browser/web.main.ts
浏览文件 @
2024296a
...
...
@@ -29,6 +29,7 @@ import { IWorkspaceInitializationPayload } from 'vs/platform/workspaces/common/w
import
{
WorkspaceService
}
from
'
vs/workbench/services/configuration/browser/configurationService
'
;
import
{
ConfigurationCache
}
from
'
vs/workbench/services/configuration/browser/configurationCache
'
;
import
{
ConfigurationFileService
}
from
'
vs/workbench/services/configuration/common/configuration
'
;
import
{
WebResources
}
from
'
vs/workbench/browser/web.resources
'
;
interface
IWindowConfiguration
{
settingsUri
:
URI
;
...
...
@@ -61,6 +62,9 @@ class CodeRendererMain extends Disposable {
// Layout
this
.
_register
(
addDisposableListener
(
window
,
EventType
.
RESIZE
,
()
=>
this
.
workbench
.
layout
()));
// Resource Loading
this
.
_register
(
new
WebResources
(
<
IFileService
>
services
.
serviceCollection
.
get
(
IFileService
)));
// Workbench Lifecycle
this
.
_register
(
this
.
workbench
.
onShutdown
(()
=>
this
.
dispose
()));
...
...
@@ -188,4 +192,4 @@ function toResource(path: string): URI {
authority
:
document
.
location
.
host
,
path
});
}
\ No newline at end of file
}
src/vs/workbench/browser/web.resources.ts
0 → 100644
浏览文件 @
2024296a
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import
{
IFileService
}
from
'
vs/platform/files/common/files
'
;
import
{
URI
}
from
'
vs/base/common/uri
'
;
export
class
WebResources
{
private
readonly
_regexp
=
/url
\((
'|"
)?(
vscode-remote:
\/\/
.*
?)\1\)
/g
;
private
readonly
_cache
=
new
Map
<
string
,
string
>
();
private
readonly
_observer
:
MutationObserver
;
constructor
(@
IFileService
private
readonly
_fileService
:
IFileService
)
{
this
.
_observer
=
new
MutationObserver
(
r
=>
this
.
_handleMutation
(
r
));
// todo@joh add observer to more than head-element
// todo@joh explore alternative approach
this
.
_observer
.
observe
(
document
.
head
,
{
subtree
:
true
,
childList
:
true
});
}
dispose
():
void
{
this
.
_observer
.
disconnect
();
this
.
_cache
.
forEach
(
value
=>
URL
.
revokeObjectURL
(
value
));
}
private
_handleMutation
(
records
:
MutationRecord
[]):
void
{
for
(
const
record
of
records
)
{
if
(
record
.
target
.
nodeName
===
'
STYLE
'
)
{
// style-element directly modified
this
.
_handleStyleNode
(
record
.
target
);
}
else
if
(
record
.
target
.
nodeName
===
'
HEAD
'
&&
record
.
type
===
'
childList
'
)
{
// style-element added to head
record
.
addedNodes
.
forEach
(
node
=>
{
if
(
node
.
nodeName
===
'
STYLE
'
)
{
this
.
_handleStyleNode
(
node
);
}
});
}
}
}
private
_handleStyleNode
(
target
:
Node
):
void
{
if
(
!
target
.
textContent
)
{
return
;
}
const
positions
:
number
[]
=
[];
const
promises
:
Promise
<
any
>
[]
=
[];
let
match
:
RegExpMatchArray
|
null
=
null
;
while
(
match
=
this
.
_regexp
.
exec
(
target
.
textContent
))
{
const
remoteUrl
=
match
[
2
];
positions
.
push
(
match
.
index
!
+
'
url(
'
.
length
+
match
[
1
].
length
);
positions
.
push
(
remoteUrl
.
length
);
if
(
this
.
_cache
.
has
(
remoteUrl
))
{
promises
.
push
(
Promise
.
resolve
());
}
else
{
promises
.
push
(
this
.
_fileService
.
readFile
(
URI
.
parse
(
remoteUrl
,
true
)).
then
(
file
=>
{
// todo@joh hack
const
type
=
/
\.
woff$/
.
test
(
remoteUrl
)
?
'
application/font-woff
'
:
'
image/svg+xml
'
;
this
.
_cache
.
set
(
remoteUrl
,
URL
.
createObjectURL
(
new
Blob
([
file
.
value
.
buffer
],
{
type
})));
}));
}
}
if
(
promises
.
length
===
0
)
{
return
;
}
let
content
=
target
.
textContent
;
Promise
.
all
(
promises
).
then
(()
=>
{
if
(
target
.
textContent
!==
content
)
{
return
;
}
for
(
let
i
=
positions
.
length
-
1
;
i
>=
0
;
i
-=
2
)
{
const
start
=
positions
[
i
-
1
];
const
len
=
positions
[
i
];
const
url
=
this
.
_cache
.
get
(
content
.
substr
(
start
,
len
));
content
=
content
.
substring
(
0
,
start
)
+
url
+
content
.
substring
(
start
+
len
);
}
target
.
textContent
=
content
;
}).
catch
(
e
=>
{
console
.
error
(
e
);
});
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录