Skip to content

Commit d5a0b29

Browse files
authored
[web] use callConstructor for FinalizationRegistry due to bug in dart2js (flutter#40798)
[web] use callConstructor for FinalizationRegistry due to bug in dart2js
1 parent fcab15f commit d5a0b29

File tree

3 files changed

+21
-6
lines changed

3 files changed

+21
-6
lines changed

lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3569,9 +3569,12 @@ extension JsConstructorExtension on JsConstructor {
35693569
@JS('window.FinalizationRegistry')
35703570
@staticInterop
35713571
class SkObjectFinalizationRegistry {
3572-
// TODO(hterkelsen): Add a type for the `cleanup` function when
3573-
// native constructors support type parameters.
3574-
external factory SkObjectFinalizationRegistry(JSFunction cleanup);
3572+
factory SkObjectFinalizationRegistry(JSFunction cleanup) {
3573+
return js_util.callConstructor(
3574+
_finalizationRegistryConstructor!.toObjectShallow,
3575+
<Object>[cleanup],
3576+
);
3577+
}
35753578
}
35763579

35773580
extension SkObjectFinalizationRegistryExtension on SkObjectFinalizationRegistry {

lib/web_ui/lib/src/engine/canvaskit/native_memory.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@ import 'canvaskit_api.dart';
1111

1212
/// Collects native objects that weren't explicitly disposed of using
1313
/// [UniqueRef.dispose] or [CountedRef.unref].
14-
SkObjectFinalizationRegistry _finalizationRegistry = SkObjectFinalizationRegistry((UniqueRef<Object> uniq) {
15-
uniq.collect();
16-
}.toJS);
14+
SkObjectFinalizationRegistry _finalizationRegistry = SkObjectFinalizationRegistry(
15+
(UniqueRef<Object> uniq) {
16+
uniq.collect();
17+
}.toJS
18+
);
1719

1820
NativeMemoryFinalizationRegistry nativeMemoryFinalizationRegistry = NativeMemoryFinalizationRegistry();
1921

lib/web_ui/test/canvaskit/canvaskit_api_test.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5+
import 'dart:js_interop';
56
import 'dart:math';
67
import 'dart:typed_data';
78

@@ -1891,6 +1892,15 @@ void _paragraphTests() {
18911892
'http://localhost:1234/foo/canvaskit.wasm',
18921893
);
18931894
});
1895+
1896+
test('SkObjectFinalizationRegistry', () {
1897+
// There's no reliable way to test the actual functionality of
1898+
// FinalizationRegistry because it depends on GC, which cannot be controlled,
1899+
// So the test simply tests that a FinalizationRegistry can be constructed
1900+
// and its `register` method can be called.
1901+
final SkObjectFinalizationRegistry registry = SkObjectFinalizationRegistry((String arg) {}.toJS);
1902+
registry.register('foo', 'bar');
1903+
});
18941904
}
18951905

18961906

0 commit comments

Comments
 (0)