Index: test/codegen/lib/html/hidden_dom_1_test.dart |
diff --git a/test/codegen/lib/html/hidden_dom_1_test.dart b/test/codegen/lib/html/hidden_dom_1_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..120136b5a3da6069887ad8d67cd68acb304979d3 |
--- /dev/null |
+++ b/test/codegen/lib/html/hidden_dom_1_test.dart |
@@ -0,0 +1,45 @@ |
+library HiddenDom1Test; |
+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: |
+// onfocus setter. |
+ |
+main() { |
+ useHtmlConfiguration(); |
+ |
+ test('test1', () { |
+ document.body.children.add(new Element.html(r''' |
+<div id='div1'> |
+Hello World! |
+</div>''')); |
+ Element e = document.query('#div1'); |
+ expect(e, isNotNull); |
+ |
+ checkNoSuchMethod(() { confuse(e).onfocus = null; }); |
+ }); |
+ |
+} |
+ |
+class Decoy { |
+ void set onfocus(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; |
+ try { |
+ action(); |
+ } catch (e) { |
+ ex = e; |
+ } |
+ if (ex == null) |
+ expect(false, isTrue, reason: 'Action should have thrown exception'); |
+ |
+ expect(ex, isNoSuchMethodError); |
+} |