diff --git a/dart/lib/html.dart b/dart/lib/html.dart
index 131f5045..d566b689 100644
--- a/dart/lib/html.dart
+++ b/dart/lib/html.dart
@@ -187,6 +187,20 @@ abstract class HtmlPageLoaderElement implements PageLoaderElement {
@override
String toString() => '$runtimeType<${node.toString()}>';
+
+ void type(String keys) {
+ _fireKeyPressEvents(node, keys);
+ loader.sync();
+ }
+
+ // This doesn't work in Dartium due to:
+ // https://code.google.com/p/dart/issues/detail?id=13902
+ void _fireKeyPressEvents(Element element, String keys) {
+ for (int charCode in keys.codeUnits) {
+ element.dispatchEvent(
+ new KeyEvent('keypress', charCode: charCode).wrapped);
+ }
+ }
}
class _ElementPageLoaderElement extends HtmlPageLoaderElement {
@@ -232,32 +246,26 @@ class _ElementPageLoaderElement extends HtmlPageLoaderElement {
@override
void type(String keys) {
+ node.focus();
+ _fireKeyPressEvents(node, keys);
if (node is InputElement) {
- _setInputValue(node, (node as InputElement).value + keys);
- } else {
- throw new PageLoaderException(
- 'HtmlPageLoader type method only supports InputElements');
+ var value = (node as InputElement).value + keys;
+ (node as InputElement).value = '';
+ node.dispatchEvent(new TextEvent('textInput', data: value));
}
+ node.blur();
+ loader.sync();
}
@override
void clear() {
if (node is InputElement) {
- _setInputValue(node, '');
+ (node as InputElement).value = '';
+ node.dispatchEvent(new TextEvent('textInput', data: ''));
} else {
super.clear();
}
}
-
- void _setInputValue(InputElement element, String value) {
- node.focus();
- bool attributeSet = node.attributes.containsKey('value');
- node.setAttribute('value', value);
- (node as InputElement).value = '';
- node.dispatchEvent(new TextEvent('textInput', data: value));
- node.blur();
- loader.sync();
- }
}
class _ShadowRootPageLoaderElement extends HtmlPageLoaderElement {
@@ -282,8 +290,6 @@ class _ShadowRootPageLoaderElement extends HtmlPageLoaderElement {
@override
PageLoaderAttributes get style => super.style;
@override
- void type(String keys) => super.type(keys);
- @override
PageLoaderAttributes get attributes => super.attributes;
@override
PageLoaderElement get shadowRoot => super.shadowRoot;
@@ -315,7 +321,14 @@ class _DocumentPageLoaderElement extends HtmlPageLoaderElement {
@override
PageLoaderAttributes get style => super.style;
@override
- void type(String keys) => super.type(keys);
+ void type(String keys) {
+ // TODO(DrMarcII) consider whether this should be sent to
+ // document.activeElement to more closely match WebDriver behavior.
+ document.body.focus();
+ _fireKeyPressEvents(document.body, keys);
+ document.body.blur();
+ loader.sync();
+ }
}
class _ElementAttributes extends PageLoaderAttributes {
diff --git a/dart/pubspec.yaml b/dart/pubspec.yaml
index efe67f9f..7be99836 100644
--- a/dart/pubspec.yaml
+++ b/dart/pubspec.yaml
@@ -1,5 +1,5 @@
name: pageloader
-version: 1.2.2+1
+version: 1.2.3
author: Marc Fisher II
description: Supports the creation of page objects that can be shared between in-browser tests and WebDriver tests.
environment:
diff --git a/dart/test/html_test.dart b/dart/test/html_test.dart
index 9ce53399..e407315c 100644
--- a/dart/test/html_test.dart
+++ b/dart/test/html_test.dart
@@ -127,6 +127,14 @@ void main() {
expect(page.text.attributes['value'], 'some text');
expect(handlerCalled, isTrue);
});
+
+ test('keypress events', () {
+ var data = 'my data';
+ var list = [];
+ html.document.body.onKeyPress.listen((evt) => list.add(evt.charCode));
+ plt.loader.globalContext.type(data);
+ expect(new String.fromCharCodes(list), equals(data));
+ });
});
plt.runTests();