Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
69fd7afc
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,发现更多精彩内容 >>
提交
69fd7afc
编写于
7月 16, 2020
作者:
B
Benjamin Pasero
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
throttle save participants in certain cases (#102542)
上级
a05390d9
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
37 addition
and
3 deletion
+37
-3
src/vs/workbench/services/textfile/common/textFileEditorModel.ts
...workbench/services/textfile/common/textFileEditorModel.ts
+37
-3
未找到文件。
src/vs/workbench/services/textfile/common/textFileEditorModel.ts
浏览文件 @
69fd7afc
...
...
@@ -75,6 +75,9 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
private
bufferSavedVersionId
:
number
|
undefined
;
private
ignoreDirtyOnModelContentChange
=
false
;
private
static
readonly
UNDO_REDO_SAVE_PARTICIPANTS_AUTO_SAVE_THROTTLE_THRESHOLD
=
500
;
private
lastModelContentChangeFromUndoRedo
:
number
|
undefined
=
undefined
;
private
lastResolvedFileStat
:
IFileStatWithMetadata
|
undefined
;
private
readonly
saveSequentializer
=
new
TaskSequentializer
();
...
...
@@ -450,16 +453,23 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
// where `value` was captured in the content change listener closure scope.
// Content Change
this
.
_register
(
model
.
onDidChangeContent
(
()
=>
this
.
onModelContentChanged
(
model
)));
this
.
_register
(
model
.
onDidChangeContent
(
e
=>
this
.
onModelContentChanged
(
model
,
e
.
isUndoing
||
e
.
isRedoing
)));
}
private
onModelContentChanged
(
model
:
ITextModel
):
void
{
private
onModelContentChanged
(
model
:
ITextModel
,
isUndoingOrRedoing
:
boolean
):
void
{
this
.
logService
.
trace
(
`[text file model] onModelContentChanged() - enter`
,
this
.
resource
.
toString
(
true
));
// In any case increment the version id because it tracks the textual content state of the model at all times
this
.
versionId
++
;
this
.
logService
.
trace
(
`[text file model] onModelContentChanged() - new versionId
${
this
.
versionId
}
`
,
this
.
resource
.
toString
(
true
));
// Remember when the user changed the model through a undo/redo operation.
// We need this information to throttle save participants to fix
// https://github.com/microsoft/vscode/issues/102542
if
(
isUndoingOrRedoing
)
{
this
.
lastModelContentChangeFromUndoRedo
=
Date
.
now
();
}
// We mark check for a dirty-state change upon model content change, unless:
// - explicitly instructed to ignore it (e.g. from model.load())
// - the model is readonly (in that case we never assume the change was done by the user)
...
...
@@ -639,7 +649,31 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
// Save participants can also be skipped through API.
if
(
this
.
isResolved
()
&&
!
options
.
skipSaveParticipants
)
{
try
{
await
this
.
textFileService
.
files
.
runSaveParticipants
(
this
,
{
reason
:
options
.
reason
??
SaveReason
.
EXPLICIT
},
saveCancellation
.
token
);
// Measure the time it took from the last undo/redo operation to this save. If this
// time is below `UNDO_REDO_SAVE_PARTICIPANTS_THROTTLE_THRESHOLD`, we make sure to
// delay the save participant for the remaining time if the reason is auto save.
//
// This fixes the following issue:
// - the user has configured auto save with delay of 100ms or shorter
// - the user has a save participant enabled that modifies the file on each save
// - the user types into the file and the file gets saved
// - the user triggers undo operation
// - this will undo the save participant change but trigger the save participant right after
// - the user has no chance to undo over the save participant
//
// Reported as: https://github.com/microsoft/vscode/issues/102542
if
(
options
.
reason
===
SaveReason
.
AUTO
&&
typeof
this
.
lastModelContentChangeFromUndoRedo
===
'
number
'
)
{
const
timeFromUndoRedoToSave
=
Date
.
now
()
-
this
.
lastModelContentChangeFromUndoRedo
;
if
(
timeFromUndoRedoToSave
<
TextFileEditorModel
.
UNDO_REDO_SAVE_PARTICIPANTS_AUTO_SAVE_THROTTLE_THRESHOLD
)
{
await
timeout
(
TextFileEditorModel
.
UNDO_REDO_SAVE_PARTICIPANTS_AUTO_SAVE_THROTTLE_THRESHOLD
-
timeFromUndoRedoToSave
);
}
}
// Run save participants unless save was cancelled meanwhile
if
(
!
saveCancellation
.
token
.
isCancellationRequested
)
{
await
this
.
textFileService
.
files
.
runSaveParticipants
(
this
,
{
reason
:
options
.
reason
??
SaveReason
.
EXPLICIT
},
saveCancellation
.
token
);
}
}
catch
(
error
)
{
this
.
logService
.
error
(
`[text file model] runSaveParticipants(
${
versionId
}
) - resulted in an error:
${
error
.
toString
()}
`
,
this
.
resource
.
toString
(
true
));
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录