library NativeGCTest; import 'package:unittest/unittest.dart'; import 'package:unittest/html_config.dart'; import 'dart:html'; var testEvent = new EventStreamProvider('test'); main() { useHtmlConfiguration(); test('EventListener', () { 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(N); // 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); }); test('WindowEventListener', () { 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(); } testDiv.onClick.listen(expectAsync((e) {})); window.postMessage(message, '*'); }); } void triggerMajorGC() { List list = new List(1000000); Element div = new DivElement(); div.onClick.listen((e) => print(list[0])); }