From 9cb7b788c4a42ac821abd145629f0ad77dcdf346 Mon Sep 17 00:00:00 2001 From: Yegor Jbanov Date: Thu, 30 Mar 2023 13:25:19 -0700 Subject: [PATCH] [web] use callConstructor for FinalizationRegistry due to bug in dart2js --- lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart | 9 ++++++--- lib/web_ui/lib/src/engine/canvaskit/native_memory.dart | 8 +++++--- lib/web_ui/test/canvaskit/canvaskit_api_test.dart | 10 ++++++++++ 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart b/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart index 6d70ee28b3f80..de79aa6a9a147 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart @@ -3569,9 +3569,12 @@ extension JsConstructorExtension on JsConstructor { @JS('window.FinalizationRegistry') @staticInterop class SkObjectFinalizationRegistry { - // TODO(hterkelsen): Add a type for the `cleanup` function when - // native constructors support type parameters. - external factory SkObjectFinalizationRegistry(JSFunction cleanup); + factory SkObjectFinalizationRegistry(JSFunction cleanup) { + return js_util.callConstructor( + _finalizationRegistryConstructor!.toObjectShallow, + [cleanup], + ); + } } extension SkObjectFinalizationRegistryExtension on SkObjectFinalizationRegistry { diff --git a/lib/web_ui/lib/src/engine/canvaskit/native_memory.dart b/lib/web_ui/lib/src/engine/canvaskit/native_memory.dart index 77d80f8f5e39d..45b051c5058e1 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/native_memory.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/native_memory.dart @@ -11,9 +11,11 @@ import 'canvaskit_api.dart'; /// Collects native objects that weren't explicitly disposed of using /// [UniqueRef.dispose] or [CountedRef.unref]. -SkObjectFinalizationRegistry _finalizationRegistry = SkObjectFinalizationRegistry((UniqueRef uniq) { - uniq.collect(); -}.toJS); +SkObjectFinalizationRegistry _finalizationRegistry = SkObjectFinalizationRegistry( + (UniqueRef uniq) { + uniq.collect(); + }.toJS +); NativeMemoryFinalizationRegistry nativeMemoryFinalizationRegistry = NativeMemoryFinalizationRegistry(); diff --git a/lib/web_ui/test/canvaskit/canvaskit_api_test.dart b/lib/web_ui/test/canvaskit/canvaskit_api_test.dart index 03d85b0fae596..6addf29e4bafa 100644 --- a/lib/web_ui/test/canvaskit/canvaskit_api_test.dart +++ b/lib/web_ui/test/canvaskit/canvaskit_api_test.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:js_interop'; import 'dart:math'; import 'dart:typed_data'; @@ -1891,6 +1892,15 @@ void _paragraphTests() { 'http://localhost:1234/foo/canvaskit.wasm', ); }); + + test('SkObjectFinalizationRegistry', () { + // There's no reliable way to test the actual functionality of + // FinalizationRegistry because it depends on GC, which cannot be controlled, + // So the test simply tests that a FinalizationRegistry can be constructed + // and its `register` method can be called. + final SkObjectFinalizationRegistry registry = SkObjectFinalizationRegistry((String arg) {}.toJS); + registry.register('foo', 'bar'); + }); }