Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(636)

Unified Diff: tests/html/event_zone_task_test.dart

Issue 2022263002: Make Dom events run through zone tasks. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Mark as experimental Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tests/html/event_subscription_specification_test.dart ('k') | tools/dom/src/EventStreamProvider.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tests/html/event_zone_task_test.dart
diff --git a/tests/html/event_zone_task_test.dart b/tests/html/event_zone_task_test.dart
new file mode 100644
index 0000000000000000000000000000000000000000..a0e85c8a749a0535eb97cd181adecbe164932614
--- /dev/null
+++ b/tests/html/event_zone_task_test.dart
@@ -0,0 +1,239 @@
+// Copyright (c) 2016, 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 EventTaskZoneTest;
+
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+import 'dart:async';
+import 'dart:html';
+
+// Tests zone tasks with DOM events.
+
+class AbortedEventStreamSubscription implements StreamSubscription<Event> {
+ final Zone zone;
+
+ AbortedEventStreamSubscription(this.zone);
+
+ @override
+ Future asFuture([futureValue]) {
+ throw new UnsupportedError("asFuture");
+ }
+
+ @override
+ Future cancel() {
+ return null;
+ }
+
+ @override
+ bool get isPaused => throw new UnsupportedError("pause");
+
+ @override
+ void onData(void handleData(Event data)) {
+ throw new UnsupportedError("cancel");
+ }
+
+ @override
+ void onDone(void handleDone()) {
+ throw new UnsupportedError("onDone");
+ }
+
+ @override
+ void onError(Function handleError) {
+ throw new UnsupportedError("onError");
+ }
+
+ @override
+ void pause([Future resumeSignal]) {
+ throw new UnsupportedError("pause");
+ }
+
+ @override
+ void resume() {
+ throw new UnsupportedError("resume");
+ }
+
+ static AbortedEventStreamSubscription _create(
+ EventSubscriptionSpecification spec, Zone zone) {
+ return new AbortedEventStreamSubscription(zone);
+ }
+}
+
+eventTest(String name, Event eventFn(), void validate(Event event),
+ void validateSpec(EventSubscriptionSpecification spec),
+ {String type: 'foo',
+ bool abortCreation: false,
+ EventSubscriptionSpecification modifySpec(
+ EventSubscriptionSpecification spec),
+ bool abortEvent: false,
+ Event modifyEvent(Event event)}) {
+ test(name, () {
+ var lastSpec;
+ var lastTask;
+ var lastEvent;
+
+ Object createTaskHandler(Zone self, ZoneDelegate parent, Zone zone,
+ TaskCreate create, TaskSpecification specification) {
+ if (specification is EventSubscriptionSpecification) {
+ if (abortCreation) {
+ create = AbortedEventStreamSubscription._create;
+ }
+ if (modifySpec != null) {
+ specification = modifySpec(specification);
+ }
+ lastSpec = specification;
+ return lastTask = parent.createTask(zone, create, specification);
+ }
+ return parent.createTask(zone, create, specification);
+ }
+
+ void runTaskHandler(Zone self, ZoneDelegate parent, Zone zone, TaskRun run,
+ Object task, Object arg) {
+ if (identical(task, lastTask)) {
+ if (abortEvent) return;
+ if (modifyEvent != null) {
+ arg = modifyEvent(arg);
+ }
+ parent.runTask(zone, run, task, arg);
+ return;
+ }
+ parent.runTask(zone, run, task, arg);
+ }
+
+ runZoned(() {
+ final el = new Element.tag('div');
+ var fired = false;
+ var sub = el.on[type].listen((ev) {
+ lastEvent = ev;
+ fired = true;
+ });
+ el.dispatchEvent(eventFn());
+
+ validateSpec(lastSpec);
+ validate(lastEvent);
+
+ if (abortEvent || abortCreation) {
+ expect(fired, isFalse, reason: 'Expected event to be intercepted.');
+ } else {
+ expect(fired, isTrue, reason: 'Expected event to be dispatched.');
+ }
+
+ sub.cancel();
+ },
+ zoneSpecification: new ZoneSpecification(
+ createTask: createTaskHandler,
+ runTask: runTaskHandler));
+ });
+}
+
+Function checkSpec(
+ [String expectedType = 'foo', bool expectedUseCapture = false]) {
+ return (EventSubscriptionSpecification spec) {
+ expect(spec.eventType, expectedType);
+ expect(spec.useCapture, expectedUseCapture);
+ };
+}
+
+main() {
+ useHtmlConfiguration();
+
+ eventTest('Event', () => new Event('foo'), (ev) {
+ expect(ev.type, equals('foo'));
+ }, checkSpec('foo'));
+
+ eventTest(
+ 'WheelEvent',
+ () => new WheelEvent("mousewheel",
+ deltaX: 1,
+ deltaY: 0,
+ detail: 4,
+ screenX: 3,
+ screenY: 4,
+ clientX: 5,
+ clientY: 6,
+ ctrlKey: true,
+ altKey: true,
+ shiftKey: true,
+ metaKey: true), (ev) {
+ expect(ev.deltaX, 1);
+ expect(ev.deltaY, 0);
+ expect(ev.screen.x, 3);
+ expect(ev.screen.y, 4);
+ expect(ev.client.x, 5);
+ expect(ev.client.y, 6);
+ expect(ev.ctrlKey, isTrue);
+ expect(ev.altKey, isTrue);
+ expect(ev.shiftKey, isTrue);
+ expect(ev.metaKey, isTrue);
+ }, checkSpec('mousewheel'), type: 'mousewheel');
+
+ eventTest('Event - no-create', () => new Event('foo'), (ev) {
+ expect(ev, isNull);
+ }, checkSpec('foo'), abortCreation: true);
+
+ eventTest(
+ 'WheelEvent - no-create',
+ () => new WheelEvent("mousewheel",
+ deltaX: 1,
+ deltaY: 0,
+ detail: 4,
+ screenX: 3,
+ screenY: 4,
+ clientX: 5,
+ clientY: 6,
+ ctrlKey: true,
+ altKey: true,
+ shiftKey: true,
+ metaKey: true), (ev) {
+ expect(ev, isNull);
+ }, checkSpec('mousewheel'), type: 'mousewheel', abortCreation: true);
+
+ eventTest('Event - no-run', () => new Event('foo'), (ev) {
+ expect(ev, isNull);
+ }, checkSpec('foo'), abortEvent: true);
+
+ eventTest(
+ 'WheelEvent - no-run',
+ () => new WheelEvent("mousewheel",
+ deltaX: 1,
+ deltaY: 0,
+ detail: 4,
+ screenX: 3,
+ screenY: 4,
+ clientX: 5,
+ clientY: 6,
+ ctrlKey: true,
+ altKey: true,
+ shiftKey: true,
+ metaKey: true), (ev) {
+ expect(ev, isNull);
+ }, checkSpec('mousewheel'), type: 'mousewheel', abortEvent: true);
+
+ // Register for 'foo', but receive a 'bar' event, because the specification
+ // is rewritten.
+ eventTest(
+ 'Event - replace eventType',
+ () => new Event('bar'),
+ (ev) {
+ expect(ev.type, equals('bar'));
+ },
+ checkSpec('bar'),
+ type: 'foo',
+ modifySpec: (EventSubscriptionSpecification spec) {
+ return spec.replace(eventType: 'bar');
+ });
+
+ // Intercept the 'foo' event and replace it with a 'bar' event.
+ eventTest(
+ 'Event - intercept result',
+ () => new Event('foo'),
+ (ev) {
+ expect(ev.type, equals('bar'));
+ },
+ checkSpec('foo'),
+ type: 'foo',
+ modifyEvent: (Event event) {
+ return new Event('bar');
+ });
+}
« no previous file with comments | « tests/html/event_subscription_specification_test.dart ('k') | tools/dom/src/EventStreamProvider.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698