| Index: test/codegen/lib/html/hidden_dom_2_test.dart
|
| diff --git a/test/codegen/lib/html/hidden_dom_2_test.dart b/test/codegen/lib/html/hidden_dom_2_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e8abc4eee6192db3aeb01a7d882ff5d52857ff4e
|
| --- /dev/null
|
| +++ b/test/codegen/lib/html/hidden_dom_2_test.dart
|
| @@ -0,0 +1,48 @@
|
| +library HiddenDom2Test;
|
| +import 'package:unittest/unittest.dart';
|
| +import 'package:unittest/html_config.dart';
|
| +import 'dart:html';
|
| +
|
| +// Test that the dart:html API does not leak native jsdom methods:
|
| +// appendChild operation.
|
| +
|
| +main() {
|
| + useHtmlConfiguration();
|
| +
|
| + test('test1', () {
|
| + document.body.children.add(new Element.html(r'''
|
| +<div id='div1'>
|
| +Hello World!
|
| +</div>'''));
|
| + Element e = document.query('#div1');
|
| + Element e2 = new Element.html(r"<div id='xx'>XX</div>");
|
| + expect(e, isNotNull);
|
| +
|
| + checkNoSuchMethod(() { confuse(e).appendChild(e2); });
|
| +
|
| + });
|
| +}
|
| +
|
| +class Decoy {
|
| + void appendChild(x) { throw 'dead code'; }
|
| +}
|
| +
|
| +confuse(x) => opaqueTrue() ? x : (opaqueTrue() ? new Object() : new Decoy());
|
| +
|
| +/** Returns [:true:], but in a way that confuses the compiler. */
|
| +opaqueTrue() => true; // Expand as needed.
|
| +
|
| +checkNoSuchMethod(action()) {
|
| + var ex = null;
|
| + bool threw = false;
|
| + try {
|
| + action();
|
| + } catch (e) {
|
| + threw = true;
|
| + ex = e;
|
| + }
|
| + if (!threw)
|
| + expect(false, isTrue, reason: 'Action should have thrown exception');
|
| +
|
| + expect(ex, isNoSuchMethodError);
|
| +}
|
|
|