Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
weixin_43355755
engine
提交
b080bdf5
E
engine
项目概览
weixin_43355755
/
engine
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
E
engine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
b080bdf5
编写于
12月 15, 2020
作者:
F
Ferhat
提交者:
GitHub
12月 15, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Prevent recycling of canvas multiple times (#23089)
上级
730ad860
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
44 addition
and
0 deletion
+44
-0
lib/web_ui/lib/src/engine/html/picture.dart
lib/web_ui/lib/src/engine/html/picture.dart
+4
-0
lib/web_ui/test/engine/surface/scene_builder_test.dart
lib/web_ui/test/engine/surface/scene_builder_test.dart
+40
-0
未找到文件。
lib/web_ui/lib/src/engine/html/picture.dart
浏览文件 @
b080bdf5
...
...
@@ -314,6 +314,10 @@ class PersistedPicture extends PersistedLeafSurface {
// painting. This removes all the setup work and scaffolding objects
// that won't be useful for anything anyway.
_recycleCanvas
(
oldCanvas
);
if
(
oldSurface
!=
null
)
{
// Make sure it doesn't get reused/recycled again.
oldSurface
.
_canvas
=
null
;
}
if
(
rootElement
!=
null
)
{
domRenderer
.
clearDom
(
rootElement
!);
}
...
...
lib/web_ui/test/engine/surface/scene_builder_test.dart
浏览文件 @
b080bdf5
...
...
@@ -588,6 +588,40 @@ void testMain() {
expect
(
canvas2
.
width
>
unscaledWidth
,
true
);
expect
(
canvas2
.
height
>
unscaledHeight
,
true
);
});
test
(
'Should recycle canvas once'
,
()
async
{
final
SurfaceSceneBuilder
builder
=
SurfaceSceneBuilder
();
final
Picture
picture1
=
_drawPicture
();
EngineLayer
oldLayer
=
builder
.
pushClipRect
(
const
Rect
.
fromLTRB
(
10
,
10
,
300
,
300
),
);
builder
.
addPicture
(
Offset
.
zero
,
picture1
);
builder
.
pop
();
builder
.
build
();
// Force update to scene which will utilize reuse code path.
final
SurfaceSceneBuilder
builder2
=
SurfaceSceneBuilder
();
EngineLayer
oldLayer2
=
builder2
.
pushClipRect
(
const
Rect
.
fromLTRB
(
5
,
10
,
300
,
300
),
oldLayer:
oldLayer
);
builder2
.
addPicture
(
Offset
.
zero
,
_drawEmptyPicture
());
builder2
.
pop
();
html
.
HtmlElement
contentAfterReuse
=
builder2
.
build
().
webOnlyRootElement
;
expect
(
contentAfterReuse
,
isNotNull
);
final
SurfaceSceneBuilder
builder3
=
SurfaceSceneBuilder
();
builder3
.
pushClipRect
(
const
Rect
.
fromLTRB
(
25
,
10
,
300
,
300
),
oldLayer:
oldLayer2
);
builder3
.
addPicture
(
Offset
.
zero
,
_drawEmptyPicture
());
builder3
.
pop
();
// This build will crash if canvas gets recycled twice.
html
.
HtmlElement
contentAfterReuse2
=
builder3
.
build
().
webOnlyRootElement
;
expect
(
contentAfterReuse2
,
isNotNull
);
});
}
typedef
TestLayerBuilder
=
EngineLayer
Function
(
...
...
@@ -761,6 +795,12 @@ Picture _drawPicture() {
return
recorder
.
endRecording
();
}
Picture
_drawEmptyPicture
(
)
{
final
EnginePictureRecorder
recorder
=
PictureRecorder
();
recorder
.
beginRecording
(
const
Rect
.
fromLTRB
(
0
,
0
,
400
,
400
));
return
recorder
.
endRecording
();
}
Picture
_drawPathImagePath
(
)
{
const
double
offsetX
=
50
;
const
double
offsetY
=
50
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录