--- a/testing/marionette/interaction.js
+++ b/testing/marionette/interaction.js
@@ -111,17 +111,19 @@ this.interaction = {};
* in |specCompat| mode.
* @throws {ElementNotAccessibleError}
* If |strict| is true and element is not accessible.
* @throws {InvalidElementStateError}
* If |el| is not enabled.
*/
interaction.clickElement = function* (el, strict = false, specCompat = false) {
const a11y = accessibility.get(strict);
- if (specCompat) {
+ if (element.isXULElement(el)) {
+ yield chromeClick(el, a11y);
+ } else if (specCompat) {
yield webdriverClickElement(el, a11y);
} else {
yield seleniumClickElement(el, a11y);
}
};
function* webdriverClickElement (el, a11y) {
const win = getWindow(el);
@@ -161,42 +163,48 @@ function* webdriverClickElement (el, a11
yield a11y.getAccessible(el, true).then(acc => {
a11y.assertVisible(acc, el, true);
a11y.assertEnabled(acc, el, true);
a11y.assertActionable(acc, el);
});
// step 8
-
- // chrome elements
- if (element.isXULElement(el)) {
- if (el.localName == "option") {
- interaction.selectOption(el);
- } else {
- el.click();
- }
-
- // content elements
+ if (el.localName == "option") {
+ interaction.selectOption(el);
} else {
- if (el.localName == "option") {
- interaction.selectOption(el);
- } else {
- event.synthesizeMouseAtPoint(clickPoint.x, clickPoint.y, {}, win);
- }
+ event.synthesizeMouseAtPoint(clickPoint.x, clickPoint.y, {}, win);
}
// step 9
yield interaction.flushEventLoop(win);
// step 10
// TODO(ato): if the click causes navigation,
// run post-navigation checks
}
+function* chromeClick (el, a11y) {
+ if (!atom.isElementEnabled(el)) {
+ throw new InvalidElementStateError("Element is not enabled");
+ }
+
+ yield a11y.getAccessible(el, true).then(acc => {
+ a11y.assertVisible(acc, el, true);
+ a11y.assertEnabled(acc, el, true);
+ a11y.assertActionable(acc, el);
+ });
+
+ if (el.localName == "option") {
+ interaction.selectOption(el);
+ } else {
+ el.click();
+ }
+}
+
function* seleniumClickElement (el, a11y) {
let win = getWindow(el);
let visibilityCheckEl = el;
if (el.localName == "option") {
visibilityCheckEl = element.getContainer(el);
}
@@ -209,34 +217,23 @@ function* seleniumClickElement (el, a11y
}
yield a11y.getAccessible(el, true).then(acc => {
a11y.assertVisible(acc, el, true);
a11y.assertEnabled(acc, el, true);
a11y.assertActionable(acc, el);
});
- // chrome elements
- if (element.isXULElement(el)) {
- if (el.localName == "option") {
- interaction.selectOption(el);
- } else {
- el.click();
- }
-
- // content elements
+ if (el.localName == "option") {
+ interaction.selectOption(el);
} else {
- if (el.localName == "option") {
- interaction.selectOption(el);
- } else {
- let rects = el.getClientRects();
- let centre = element.getInViewCentrePoint(rects[0], win);
- let opts = {};
- event.synthesizeMouseAtPoint(centre.x, centre.y, opts, win);
- }
+ let rects = el.getClientRects();
+ let centre = element.getInViewCentrePoint(rects[0], win);
+ let opts = {};
+ event.synthesizeMouseAtPoint(centre.x, centre.y, opts, win);
}
};
/**
* Select <option> element in a <select> list.
*
* Because the dropdown list of select elements are implemented using
* native widget technology, our trusted synthesised events are not able