Files
sdk/tests/lib/html/native_gc_test.dart
T
Srujan Gaddam d3c60e0342 [dart:html] Migrate html tests with dynamic list conversions
Some tests where the list semantics aren't obvious in what we
want in the migration to NNBD.

Change-Id: I30b2d9cc5c0ea4ea360032b85ef5e48b8db27558
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/142267
Reviewed-by: Bob Nystrom <rnystrom@google.com>
2020-04-06 20:41:14 +00:00

71 lines
1.7 KiB
Dart

// 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<Event>('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<int> l = new List<int>.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<Null> 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<Null>();
testDiv.onClick.listen(((_) {
done.complete();
}));
window.postMessage(message, '*');
return done.future;
}
main() async {
testEventListener();
await testWindowEventListener();
}
void triggerMajorGC() {
List<int> list = new List<int>.filled(1000000, 0);
Element div = new DivElement();
div.onClick.listen((e) => print(list[0]));
}