| Index: test/codegen/lib/html/mutationobserver_test.dart
|
| diff --git a/test/codegen/lib/html/mutationobserver_test.dart b/test/codegen/lib/html/mutationobserver_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e2de7e0afacb78b6be179d18a7b300c7b027d12f
|
| --- /dev/null
|
| +++ b/test/codegen/lib/html/mutationobserver_test.dart
|
| @@ -0,0 +1,112 @@
|
| +// Copyright (c) 2011, 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 mutationobserver_test;
|
| +import 'package:unittest/unittest.dart';
|
| +import 'package:unittest/html_individual_config.dart';
|
| +import 'dart:html';
|
| +
|
| +// Due to https://code.google.com/p/chromium/issues/detail?id=329103
|
| +// mutationObservers sometimes do not fire if the node being observed is GCed
|
| +// so we keep around references to all nodes we have created mutation
|
| +// observers for.
|
| +var keepAlive = [];
|
| +
|
| +/**
|
| + * Test suite for Mutation Observers. This is just a small set of sanity
|
| + * checks, not a complete test suite.
|
| + */
|
| +main() {
|
| + useHtmlIndividualConfiguration();
|
| +
|
| + group('supported', () {
|
| + test('supported', () {
|
| + expect(MutationObserver.supported, true);
|
| + });
|
| + });
|
| +
|
| + var expectation = MutationObserver.supported ? returnsNormally : throws;
|
| +
|
| + group('childList', () {
|
| + mutationCallback(count, expectation) {
|
| + var done = false;
|
| + var nodes = [];
|
| +
|
| + callback(mutations, observer) {
|
| + for (MutationRecord mutation in mutations) {
|
| + for (Node node in mutation.addedNodes) {
|
| + nodes.add(node);
|
| + }
|
| + }
|
| + if (nodes.length >= count) {
|
| + done = true;
|
| + expect(nodes.length, count);
|
| + expect(nodes, expectation);
|
| + }
|
| + }
|
| +
|
| + // If it's not supported, don't block waiting for it.
|
| + if (!MutationObserver.supported) {
|
| + return () => done;
|
| + }
|
| +
|
| + return expectAsyncUntil(callback, () => done);
|
| + }
|
| +
|
| + test('empty options is syntax error', () {
|
| + expect(() {
|
| + var mutationObserver = new MutationObserver(
|
| + (mutations, observer) { expect(false, isTrue,
|
| + reason: 'Should not be reached'); });
|
| + expect(() { mutationObserver.observe(document, {}); },
|
| + throws);
|
| + }, expectation);
|
| + });
|
| +
|
| + test('direct-parallel options-named', () {
|
| + expect(() {
|
| + var container = new DivElement();
|
| + keepAlive.add(container);
|
| + var div1 = new DivElement();
|
| + var div2 = new DivElement();
|
| + var mutationObserver = new MutationObserver(
|
| + mutationCallback(2, orderedEquals([div1, div2])));
|
| + mutationObserver.observe(container, childList: true);
|
| +
|
| + container.append(div1);
|
| + container.append(div2);
|
| + }, expectation);
|
| + });
|
| +
|
| + test('direct-nested options-named', () {
|
| + expect(() {
|
| + var container = new DivElement();
|
| + keepAlive.add(container);
|
| + var div1 = new DivElement();
|
| + var div2 = new DivElement();
|
| + var mutationObserver =
|
| + new MutationObserver(mutationCallback(1, orderedEquals([div1])));
|
| + mutationObserver.observe(container, childList: true);
|
| +
|
| + container.append(div1);
|
| + div1.append(div2);
|
| + }, expectation);
|
| + });
|
| +
|
| + test('subtree options-named', () {
|
| + expect(() {
|
| + var container = new DivElement();
|
| + keepAlive.add(container);
|
| + var div1 = new DivElement();
|
| + var div2 = new DivElement();
|
| + var mutationObserver = new MutationObserver(
|
| + mutationCallback(2, orderedEquals([div1, div2])));
|
| + mutationObserver.observe(container, childList: true, subtree: true);
|
| +
|
| + container.append(div1);
|
| + div1.append(div2);
|
| + }, expectation);
|
| + });
|
| + });
|
| +}
|
|
|