Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
sxychenjing
engine
提交
2351391b
E
engine
项目概览
sxychenjing
/
engine
与 Fork 源项目一致
从无法访问的项目Fork
通知
3
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,发现更多精彩内容 >>
未验证
提交
2351391b
编写于
1月 28, 2021
作者:
Y
Yegor
提交者:
GitHub
1月 28, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[canvaskit] remove the DOM node of unrendered platform view (#24001)
上级
808f6f09
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
100 addition
and
6 deletion
+100
-6
lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart
lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart
+19
-5
lib/web_ui/test/canvaskit/embedded_views_test.dart
lib/web_ui/test/canvaskit/embedded_views_test.dart
+81
-1
未找到文件。
lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart
浏览文件 @
2351391b
...
...
@@ -359,14 +359,17 @@ class HtmlViewEmbedder {
final
Set
<
int
>
unusedViews
=
Set
<
int
>.
from
(
_activeCompositionOrder
);
_activeCompositionOrder
.
clear
();
List
<
int
>?
debugInvalidViewIds
;
for
(
int
i
=
0
;
i
<
_compositionOrder
.
length
;
i
++)
{
int
viewId
=
_compositionOrder
[
i
];
assert
(
_views
.
containsKey
(
viewId
),
'Cannot render platform view
$viewId
. '
'It has not been created, or it has been deleted.'
,
);
if
(
assertionsEnabled
)
{
if
(!
_views
.
containsKey
(
viewId
))
{
debugInvalidViewIds
??=
<
int
>[];
debugInvalidViewIds
.
add
(
viewId
);
continue
;
}
}
unusedViews
.
remove
(
viewId
);
html
.
Element
platformViewRoot
=
_rootViews
[
viewId
]!;
...
...
@@ -381,6 +384,16 @@ class HtmlViewEmbedder {
for
(
final
int
unusedViewId
in
unusedViews
)
{
_releaseOverlay
(
unusedViewId
);
_rootViews
[
unusedViewId
]?.
remove
();
}
if
(
assertionsEnabled
)
{
if
(
debugInvalidViewIds
!=
null
&&
debugInvalidViewIds
.
isNotEmpty
)
{
throw
AssertionError
(
'Cannot render platform views:
${debugInvalidViewIds.join(', ')}
. '
'These views have not been created, or they have been deleted.'
,
);
}
}
}
...
...
@@ -476,6 +489,7 @@ class OverlayCache {
for
(
final
Surface
overlay
in
_cache
)
{
overlay
.
dispose
();
}
_cache
.
clear
();
}
}
...
...
lib/web_ui/test/canvaskit/embedded_views_test.dart
浏览文件 @
2351391b
...
...
@@ -287,9 +287,79 @@ void testMain() {
}
on
AssertionError
catch
(
error
)
{
expect
(
error
.
toString
(),
'Assertion failed: "Cannot render platform view
0. It has not been created, or it has
been deleted."'
,
'Assertion failed: "Cannot render platform view
s: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. These views have not been created, or they have
been deleted."'
,
);
}
// Frame 7:
// Render: a platform view after error.
// Expect: success. Just checking the system is not left in a corrupted state.
await
_createPlatformView
(
0
,
'test-platform-view'
);
renderTestScene
(
viewCount:
0
);
});
test
(
'embeds and disposes of a platform view'
,
()
async
{
ui
.
platformViewRegistry
.
registerViewFactory
(
'test-platform-view'
,
(
viewId
)
=>
html
.
DivElement
()..
id
=
'view-0'
,
);
await
_createPlatformView
(
0
,
'test-platform-view'
);
final
EnginePlatformDispatcher
dispatcher
=
ui
.
window
.
platformDispatcher
as
EnginePlatformDispatcher
;
LayerSceneBuilder
sb
=
LayerSceneBuilder
();
sb
.
pushOffset
(
0
,
0
);
sb
.
addPlatformView
(
0
,
width:
10
,
height:
10
);
dispatcher
.
rasterizer
!.
draw
(
sb
.
build
().
layerTree
);
expect
(
domRenderer
.
sceneElement
!.
querySelectorAll
(
'#view-0'
),
hasLength
(
1
),
);
await
_disposePlatformView
(
0
);
sb
=
LayerSceneBuilder
();
sb
.
pushOffset
(
0
,
0
);
dispatcher
.
rasterizer
!.
draw
(
sb
.
build
().
layerTree
);
expect
(
domRenderer
.
sceneElement
!.
querySelectorAll
(
'#view-0'
),
hasLength
(
0
),
);
});
test
(
'removed the DOM node of an unrendered platform view'
,
()
async
{
ui
.
platformViewRegistry
.
registerViewFactory
(
'test-platform-view'
,
(
viewId
)
=>
html
.
DivElement
()..
id
=
'view-0'
,
);
await
_createPlatformView
(
0
,
'test-platform-view'
);
final
EnginePlatformDispatcher
dispatcher
=
ui
.
window
.
platformDispatcher
as
EnginePlatformDispatcher
;
LayerSceneBuilder
sb
=
LayerSceneBuilder
();
sb
.
pushOffset
(
0
,
0
);
sb
.
addPlatformView
(
0
,
width:
10
,
height:
10
);
dispatcher
.
rasterizer
!.
draw
(
sb
.
build
().
layerTree
);
expect
(
domRenderer
.
sceneElement
!.
querySelectorAll
(
'#view-0'
),
hasLength
(
1
),
);
// Render a frame without a platform view, but also without disposing of
// the platform view.
sb
=
LayerSceneBuilder
();
sb
.
pushOffset
(
0
,
0
);
dispatcher
.
rasterizer
!.
draw
(
sb
.
build
().
layerTree
);
expect
(
domRenderer
.
sceneElement
!.
querySelectorAll
(
'#view-0'
),
hasLength
(
0
),
);
});
// TODO: https://github.com/flutter/flutter/issues/60040
},
skip:
isIosSafari
);
...
...
@@ -311,3 +381,13 @@ Future<void> _createPlatformView(int id, String viewType) {
);
return
completer
.
future
;
}
Future
<
void
>
_disposePlatformView
(
int
id
)
{
final
completer
=
Completer
<
void
>();
window
.
sendPlatformMessage
(
'flutter/platform_views'
,
codec
.
encodeMethodCall
(
MethodCall
(
'dispose'
,
id
)),
(
dynamic
_
)
=>
completer
.
complete
(),
);
return
completer
.
future
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录