mirror of
https://github.com/dart-lang/sdk
synced 2024-11-05 18:22:09 +00:00
6a7c037aa6
This reverts commit34d3c37233
. Committed:f746f8f77e
R=lrn@google.com Review URL: https://codereview.chromium.org/2119243002 . Reverted:dae3922915
239 lines
6.2 KiB
Dart
239 lines
6.2 KiB
Dart
// 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');
|
|
});
|
|
}
|