Index: client/tests/client/dom/HiddenDom1Test.dart |
diff --git a/client/tests/client/dom/HiddenDom1Test.dart b/client/tests/client/dom/HiddenDom1Test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b0a5597fa6b132068d35e52c764f9825a8c8678c |
--- /dev/null |
+++ b/client/tests/client/dom/HiddenDom1Test.dart |
@@ -0,0 +1,44 @@ |
+#library('HiddenDom1Test'); |
+#import('../../../testing/unittest/unittest.dart'); |
+#import('dart:html'); |
+ |
+// Test that the dart:html API does not leak native jsdom methods: |
+// onfocus setter. |
+ |
+main() { |
+ forLayoutTests(); |
+ |
+ test('test1', () { |
+ document.body.elements.add(new Element.html(@''' |
+<div id='div1'> |
+Hello World! |
+</div>''')); |
+ Element e = document.query('#div1'); |
+ Expect.isTrue(e != null); |
+ |
+ 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 (var e) { |
+ ex = e; |
+ } |
+ if (ex === null) |
+ Expect.fail('Action should have thrown exception'); |
+ |
+ Expect.isTrue(ex is NoSuchMethodException, 'ex is NoSuchMethodException'); |
+} |