d3c60e0342
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>
71 lines
1.7 KiB
Dart
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]));
|
|
}
|