Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/web_ui/lib/src/engine/canvaskit/native_memory.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import 'package:ui/src/engine.dart';
/// 4. GC decides to perform a GC cycle and collects CkPaint.
/// 5. The finalizer function is called with the SkPaint as the sole argument.
/// 6. We call `delete` on SkPaint.
DomFinalizationRegistry _finalizationRegistry = DomFinalizationRegistry(
DomFinalizationRegistry _finalizationRegistry = createDomFinalizationRegistry(
(UniqueRef<Object> uniq) {
uniq.collect();
}.toJS
Expand Down
19 changes: 13 additions & 6 deletions lib/web_ui/lib/src/engine/dom.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3438,9 +3438,19 @@ extension DomTextDecoderExtension on DomTextDecoder {

@JS('window.FinalizationRegistry')
@staticInterop
class DomFinalizationRegistry {
external factory DomFinalizationRegistry(JSFunction cleanup);
}
class DomFinalizationRegistry {}

@JS('window.FinalizationRegistry')
external JSAny? get _finalizationRegistryConstructor;

// Note: We don't use a factory constructor here because there is an issue in
// dart2js that causes a crash in the Google3 build if we do use a factory
// constructor. See b/284478971
DomFinalizationRegistry createDomFinalizationRegistry(JSFunction cleanup) =>
js_util.callConstructor(
_finalizationRegistryConstructor!.toObjectShallow,
<Object>[cleanup]
);

extension DomFinalizationRegistryExtension on DomFinalizationRegistry {
@JS('register')
Expand All @@ -3461,9 +3471,6 @@ extension DomFinalizationRegistryExtension on DomFinalizationRegistry {
void unregister(Object token) => _unregister(token.toJSAnyShallow);
}

@JS('window.FinalizationRegistry')
external JSAny? get _finalizationRegistryConstructor;

/// Whether the current browser supports `FinalizationRegistry`.
bool browserSupportsFinalizationRegistry =
_finalizationRegistryConstructor != null;
2 changes: 1 addition & 1 deletion lib/web_ui/lib/src/engine/skwasm/skwasm_impl/memory.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ typedef DisposeFunction<T extends NativeType> = void Function(Pointer<T>);

class SkwasmFinalizationRegistry<T extends NativeType> {
SkwasmFinalizationRegistry(this.dispose)
: registry = DomFinalizationRegistry(((JSNumber address) =>
: registry = createDomFinalizationRegistry(((JSNumber address) =>
dispose(Pointer<T>.fromAddress(address.toDart.toInt()))
).toJS);

Expand Down
2 changes: 1 addition & 1 deletion lib/web_ui/test/canvaskit/canvaskit_api_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1907,7 +1907,7 @@ void _paragraphTests() {
// 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 DomFinalizationRegistry registry = DomFinalizationRegistry((String arg) {}.toJS);
final DomFinalizationRegistry registry = createDomFinalizationRegistry((String arg) {}.toJS);
registry.register(Object(), Object());
});
}
Expand Down