Index: test/codegen/lib/html/native_gc_test.dart |
diff --git a/test/codegen/lib/html/native_gc_test.dart b/test/codegen/lib/html/native_gc_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5931cc840a747432b32d987e33546d3882601e2c |
--- /dev/null |
+++ b/test/codegen/lib/html/native_gc_test.dart |
@@ -0,0 +1,59 @@ |
+library NativeGCTest; |
+import 'package:unittest/unittest.dart'; |
+import 'package:unittest/html_config.dart'; |
+import 'dart:html'; |
+ |
+var testEvent = new EventStreamProvider<Event>('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])); |
+} |