Index: tests/html/js_package_dom_test.dart |
diff --git a/tests/html/js_package_dom_test.dart b/tests/html/js_package_dom_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..aeb513b385292435d34acc8c72812ff243554b43 |
--- /dev/null |
+++ b/tests/html/js_package_dom_test.dart |
@@ -0,0 +1,168 @@ |
+// Copyright (c) 2015, 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 js_package_dom_test; |
+ |
+import 'package:js/js.dart'; |
+import 'package:unittest/unittest.dart'; |
+import 'package:unittest/html_config.dart'; |
+import 'package:unittest/html_individual_config.dart'; |
+import 'simple_dom.dart' as dom; |
+ |
+import 'dart:html' as html; |
+import 'dart:js' as js; |
+ |
+@JS() |
+@anonymous |
+class ExampleLiteral { |
+ external factory ExampleLiteral({a, b}); |
+ external get a; |
+ external get b; |
+} |
+ |
+main() { |
+ useHtmlIndividualConfiguration(); |
+ |
+ group('no wrappers', () { |
+ test('simple', () { |
+ expect(identical(html.window, dom.window), isTrue); |
+ }); |
+ }); |
+ |
+ group('type checks', () { |
+ test('simple', () { |
+ expect(dom.window is html.Window, isTrue); |
+ expect(dom.window is js.JsObject, isFalse); |
+ |
+ expect(dom.window.document is html.Document, isTrue); |
+ expect(dom.window.document is js.JsObject, isFalse); |
+ expect(dom.window.document.JS$addEventListener is Function, isTrue); |
+ }); |
+ }); |
+ |
+ group('expando', () { |
+ test('simple', () { |
+ dom.window.document.exampleNodeExpando = 42; |
+ expect(dom.window.document.exampleNodeExpando, equals(42)); |
+ |
+ expect((html.window.document as dynamic).exampleNodeExpando, equals(42)); |
+ |
+ // Not an actual expando specified in simple_dom.dart. |
+ expect(() => (dom.window.document as dynamic).exampleInvalidNodeExpando, throws); |
+ }); |
+ }); |
+ |
+ group('event listener', () { |
+ test('allowInterop dom', () { |
+ var eventType = 'dummyEvent'; |
+ dom.Event e = new dom.Event(eventType); |
+ var listenerCalls = 0; |
+ eventListener(dom.Event event) { |
+ expect(event.type, equals(eventType)); |
+ listenerCalls++; |
+ } |
+ |
+ var eventListenerCaptureThisCalls = 0; |
+ eventListenerCaptureThis(dom.Node that, dom.Event event) { |
+ print(that); |
+ expect(identical(that, dom.document), isTrue); |
+ expect(event.type, equals(eventType)); |
+ eventListenerCaptureThisCalls++; |
+ } |
+ |
+ var interopListener = allowInterop(eventListener); |
+ dom.document.JS$addEventListener(eventType, interopListener); |
+ |
+ var interopListenerCaptureThis = allowInteropCaptureThis(eventListenerCaptureThis); |
+ dom.document.JS$addEventListener(eventType, interopListenerCaptureThis); |
+ |
+ dom.document.dispatchEvent(e); |
+ |
+ expect(listenerCalls, equals(1)); |
+ expect(eventListenerCaptureThisCalls, equals(1)); |
+ |
+ dom.document.dispatchEvent(new dom.Event(eventType)); |
+ |
+ expect(listenerCalls, equals(2)); |
+ expect(eventListenerCaptureThisCalls, equals(2)); |
+ |
+ // Verify that event listeners can be removed. |
+ dom.document.JS$removeEventListener(eventType, interopListener); |
+ dom.document.JS$removeEventListener(eventType, interopListenerCaptureThis); |
+ dom.document.dispatchEvent(new dom.Event(eventType)); |
+ |
+ expect(eventListenerCaptureThisCalls, equals(2)); |
+ expect(listenerCalls, equals(2)); |
+ }); |
+ |
+ // This test is identical to the previous test except we intentionally call |
+ // addEventlistener instead of JS$addEventListener so that we fall back to |
+ // the dart:html version. This verifies the two versions are compatible. |
+ test('allowInterop html', () { |
+ var eventType = 'dummyEvent'; |
+ dom.Event e = new dom.Event(eventType); |
+ var listenerCalls = 0; |
+ eventListener(dom.Event event) { |
+ expect(event.type, equals(eventType)); |
+ listenerCalls++; |
+ } |
+ |
+ var eventListenerCaptureThisCalls = 0; |
+ eventListenerCaptureThis(dom.Node that, dom.Event event) { |
+ expect(identical(that, dom.document), isTrue); |
+ expect(event.type, equals(eventType)); |
+ eventListenerCaptureThisCalls++; |
+ } |
+ |
+ var interopListener = allowInterop(eventListener); |
+ dom.document.addEventListener(eventType, interopListener); |
+ |
+ var interopListenerCaptureThis = allowInteropCaptureThis(eventListenerCaptureThis); |
+ dom.document.addEventListener(eventType, interopListenerCaptureThis); |
+ |
+ dom.document.dispatchEvent(e); |
+ |
+ expect(listenerCalls, equals(1)); |
+ expect(eventListenerCaptureThisCalls, equals(1)); |
+ |
+ dom.document.dispatchEvent(new dom.Event(eventType)); |
+ |
+ expect(listenerCalls, equals(2)); |
+ expect(eventListenerCaptureThisCalls, equals(2)); |
+ |
+ // Verify that dom removeEventLister is compatible with dart:html |
+ // addEventlistener. |
+ dom.document.JS$removeEventListener(eventType, interopListener); |
+ dom.document.JS$removeEventListener(eventType, interopListenerCaptureThis); |
+ dom.document.dispatchEvent(new dom.Event(eventType)); |
+ |
+ expect(eventListenerCaptureThisCalls, equals(2)); |
+ expect(listenerCalls, equals(2)); |
+ }); |
+ }); |
+ |
+ group('dartium', () { |
+ test('type checks', () { |
+ expect(dom.window is dom.Window, isTrue); |
+ expect(dom.window.document is dom.Document, isTrue); |
+ }); |
+ // These tests only pass in Dartium as the checks to make them pass in |
+ // dart2js could not be implemented efficiently. |
+ test('forgot allowIntero', () { |
+ var eventListener = (event) => true; |
+ expect(() => dom.document.exampleNodeExpando = eventListener, throws); |
+ expect(() => dom.document.JS$addEventListener('foo', eventListener), throws); |
+ // Test that forgetting to call allowInterop is caught for top level |
+ // methods. |
+ expect(() => dom.documentAddEventListener('foo', eventListener), throws); |
+ |
+ // Test that it is caught for object literal constructors |
+ expect(() => new ExampleLiteral(a: "foo", b: eventListener), throws); |
+ |
+ // This does not throw as this actually invokes the dart:html version as |
+ // dart:html wins naming conflicts with JS interop. |
+ dom.document.addEventListener('foo', eventListener); |
+ }); |
+ }); |
+} |