OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 |
| 5 library js_package_dom_test; |
| 6 |
| 7 import 'package:js/js.dart'; |
| 8 import 'package:unittest/unittest.dart'; |
| 9 import 'package:unittest/html_config.dart'; |
| 10 import 'package:unittest/html_individual_config.dart'; |
| 11 import 'simple_dom.dart' as dom; |
| 12 |
| 13 import 'dart:html' as html; |
| 14 import 'dart:js' as js; |
| 15 |
| 16 @JS() |
| 17 @anonymous |
| 18 class ExampleLiteral { |
| 19 external factory ExampleLiteral({a, b}); |
| 20 external get a; |
| 21 external get b; |
| 22 } |
| 23 |
| 24 main() { |
| 25 useHtmlIndividualConfiguration(); |
| 26 |
| 27 group('no wrappers', () { |
| 28 test('simple', () { |
| 29 expect(identical(html.window, dom.window), isTrue); |
| 30 }); |
| 31 }); |
| 32 |
| 33 group('type checks', () { |
| 34 test('simple', () { |
| 35 expect(dom.window is html.Window, isTrue); |
| 36 expect(dom.window is js.JsObject, isFalse); |
| 37 |
| 38 expect(dom.window.document is html.Document, isTrue); |
| 39 expect(dom.window.document is js.JsObject, isFalse); |
| 40 expect(dom.window.document.JS$addEventListener is Function, isTrue); |
| 41 }); |
| 42 }); |
| 43 |
| 44 group('expando', () { |
| 45 test('simple', () { |
| 46 dom.window.document.exampleNodeExpando = 42; |
| 47 expect(dom.window.document.exampleNodeExpando, equals(42)); |
| 48 |
| 49 expect((html.window.document as dynamic).exampleNodeExpando, equals(42)); |
| 50 |
| 51 // Not an actual expando specified in simple_dom.dart. |
| 52 expect(() => (dom.window.document as dynamic).exampleInvalidNodeExpando, t
hrows); |
| 53 }); |
| 54 }); |
| 55 |
| 56 group('event listener', () { |
| 57 test('allowInterop dom', () { |
| 58 var eventType = 'dummyEvent'; |
| 59 dom.Event e = new dom.Event(eventType); |
| 60 var listenerCalls = 0; |
| 61 eventListener(dom.Event event) { |
| 62 expect(event.type, equals(eventType)); |
| 63 listenerCalls++; |
| 64 } |
| 65 |
| 66 var eventListenerCaptureThisCalls = 0; |
| 67 eventListenerCaptureThis(dom.Node that, dom.Event event) { |
| 68 print(that); |
| 69 expect(identical(that, dom.document), isTrue); |
| 70 expect(event.type, equals(eventType)); |
| 71 eventListenerCaptureThisCalls++; |
| 72 } |
| 73 |
| 74 var interopListener = allowInterop(eventListener); |
| 75 dom.document.JS$addEventListener(eventType, interopListener); |
| 76 |
| 77 var interopListenerCaptureThis = allowInteropCaptureThis(eventListenerCapt
ureThis); |
| 78 dom.document.JS$addEventListener(eventType, interopListenerCaptureThis); |
| 79 |
| 80 dom.document.dispatchEvent(e); |
| 81 |
| 82 expect(listenerCalls, equals(1)); |
| 83 expect(eventListenerCaptureThisCalls, equals(1)); |
| 84 |
| 85 dom.document.dispatchEvent(new dom.Event(eventType)); |
| 86 |
| 87 expect(listenerCalls, equals(2)); |
| 88 expect(eventListenerCaptureThisCalls, equals(2)); |
| 89 |
| 90 // Verify that event listeners can be removed. |
| 91 dom.document.JS$removeEventListener(eventType, interopListener); |
| 92 dom.document.JS$removeEventListener(eventType, interopListenerCaptureThis)
; |
| 93 dom.document.dispatchEvent(new dom.Event(eventType)); |
| 94 |
| 95 expect(eventListenerCaptureThisCalls, equals(2)); |
| 96 expect(listenerCalls, equals(2)); |
| 97 }); |
| 98 |
| 99 // This test is identical to the previous test except we intentionally call |
| 100 // addEventlistener instead of JS$addEventListener so that we fall back to |
| 101 // the dart:html version. This verifies the two versions are compatible. |
| 102 test('allowInterop html', () { |
| 103 var eventType = 'dummyEvent'; |
| 104 dom.Event e = new dom.Event(eventType); |
| 105 var listenerCalls = 0; |
| 106 eventListener(dom.Event event) { |
| 107 expect(event.type, equals(eventType)); |
| 108 listenerCalls++; |
| 109 } |
| 110 |
| 111 var eventListenerCaptureThisCalls = 0; |
| 112 eventListenerCaptureThis(dom.Node that, dom.Event event) { |
| 113 expect(identical(that, dom.document), isTrue); |
| 114 expect(event.type, equals(eventType)); |
| 115 eventListenerCaptureThisCalls++; |
| 116 } |
| 117 |
| 118 var interopListener = allowInterop(eventListener); |
| 119 dom.document.addEventListener(eventType, interopListener); |
| 120 |
| 121 var interopListenerCaptureThis = allowInteropCaptureThis(eventListenerCapt
ureThis); |
| 122 dom.document.addEventListener(eventType, interopListenerCaptureThis); |
| 123 |
| 124 dom.document.dispatchEvent(e); |
| 125 |
| 126 expect(listenerCalls, equals(1)); |
| 127 expect(eventListenerCaptureThisCalls, equals(1)); |
| 128 |
| 129 dom.document.dispatchEvent(new dom.Event(eventType)); |
| 130 |
| 131 expect(listenerCalls, equals(2)); |
| 132 expect(eventListenerCaptureThisCalls, equals(2)); |
| 133 |
| 134 // Verify that dom removeEventLister is compatible with dart:html |
| 135 // addEventlistener. |
| 136 dom.document.JS$removeEventListener(eventType, interopListener); |
| 137 dom.document.JS$removeEventListener(eventType, interopListenerCaptureThis)
; |
| 138 dom.document.dispatchEvent(new dom.Event(eventType)); |
| 139 |
| 140 expect(eventListenerCaptureThisCalls, equals(2)); |
| 141 expect(listenerCalls, equals(2)); |
| 142 }); |
| 143 }); |
| 144 |
| 145 group('dartium', () { |
| 146 test('type checks', () { |
| 147 expect(dom.window is dom.Window, isTrue); |
| 148 expect(dom.window.document is dom.Document, isTrue); |
| 149 }); |
| 150 // These tests only pass in Dartium as the checks to make them pass in |
| 151 // dart2js could not be implemented efficiently. |
| 152 test('forgot allowIntero', () { |
| 153 var eventListener = (event) => true; |
| 154 expect(() => dom.document.exampleNodeExpando = eventListener, throws); |
| 155 expect(() => dom.document.JS$addEventListener('foo', eventListener), throw
s); |
| 156 // Test that forgetting to call allowInterop is caught for top level |
| 157 // methods. |
| 158 expect(() => dom.documentAddEventListener('foo', eventListener), throws); |
| 159 |
| 160 // Test that it is caught for object literal constructors |
| 161 expect(() => new ExampleLiteral(a: "foo", b: eventListener), throws); |
| 162 |
| 163 // This does not throw as this actually invokes the dart:html version as |
| 164 // dart:html wins naming conflicts with JS interop. |
| 165 dom.document.addEventListener('foo', eventListener); |
| 166 }); |
| 167 }); |
| 168 } |
OLD | NEW |