// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. library NativeGCTest; import 'dart:async'; import 'dart:html'; import 'package:expect/minitest.dart'; var testEvent = new EventStreamProvider('test'); void testEventListener() { final int N = 1000000; final int M = 1000; var div; for (int i = 0; i < M; ++i) { // This memory should be freed when the listener below is // collected. List l = new List.filled(N, 0); // Record the iteration number. l[N - 1] = i; div = new Element.tag('div'); testEvent.forTarget(div).listen((_) { // Only the final iteration's listener should be invoked. // Note: the reference to l keeps the entire list alive. expect(l[N - 1], M - 1); }); } final event = new Event('test'); div.dispatchEvent(event); } Future testWindowEventListener() { String message = 'WindowEventListenerTestPingMessage'; Element testDiv = new DivElement(); testDiv.id = '#TestDiv'; document.body!.append(testDiv); window.onMessage.listen((e) { if (e.data == message) testDiv.click(); }); for (int i = 0; i < 100; ++i) { triggerMajorGC(); } final done = new Completer(); testDiv.onClick.listen(((_) { done.complete(); })); window.postMessage(message, '*'); return done.future; } main() async { testEventListener(); await testWindowEventListener(); } void triggerMajorGC() { List list = new List.filled(1000000, 0); Element div = new DivElement(); div.onClick.listen((e) => print(list[0])); }