Skip to content

Commit

Permalink
Making keyboard interactions to retain selection. Fixes issue 2779
Browse files Browse the repository at this point in the history
  • Loading branch information
barancev committed Nov 11, 2014
1 parent aa34ecd commit 6da62ec
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ public void testSendingKeyDownOnly() {
releaseShift.perform();

assertTrue("Key down event not isolated, got: " + logText,
logText.endsWith("keydown"));
logText.endsWith("keydown"));
}

@JavascriptEnabled
Expand Down Expand Up @@ -200,6 +200,77 @@ public void canGenerateKeyboardShortcuts() {
assertBackgroundColor(body, Colors.SILVER);
}

@Test
@Ignore({HTMLUNIT, OPERA, OPERA_MOBILE})
public void testSelectionSelectBySymbol() {
driver.get(pages.javascriptPage);

WebElement keyReporter = driver.findElement(By.id("keyReporter"));

getBuilder(driver).click(keyReporter).sendKeys("abc def").perform();
assertThat(keyReporter.getAttribute("value"), is("abc def"));

getBuilder(driver).click(keyReporter)
.keyDown(Keys.SHIFT)
.sendKeys(Keys.LEFT)
.sendKeys(Keys.LEFT)
.keyUp(Keys.SHIFT)
.sendKeys(Keys.DELETE)
.perform();

assertThat(keyReporter.getAttribute("value"), is("abc d"));
}

@Test
@Ignore({HTMLUNIT, IE, OPERA, OPERA_MOBILE})
public void testSelectionSelectByWord() {
assumeTrue(
"Test fails with native events enabled, likely due to issue 4385",
!TestUtilities.isFirefox(driver) || !TestUtilities.isNativeEventsEnabled(driver));

driver.get(pages.javascriptPage);

WebElement keyReporter = driver.findElement(By.id("keyReporter"));

getBuilder(driver).click(keyReporter).sendKeys("abc def").perform();
assertThat(keyReporter.getAttribute("value"), is("abc def"));

getBuilder(driver).click(keyReporter)
.keyDown(Keys.SHIFT)
.keyDown(Keys.CONTROL)
.sendKeys(Keys.LEFT)
.keyUp(Keys.CONTROL)
.keyUp(Keys.SHIFT)
.sendKeys(Keys.DELETE)
.perform();

assertThat(keyReporter.getAttribute("value"), is("abc "));
}

@Test
@Ignore({HTMLUNIT, IE, OPERA, OPERA_MOBILE})
public void testSelectionSelectAll() {
assumeTrue(
"Test fails with native events enabled, likely due to issue 4385",
!TestUtilities.isFirefox(driver) || !TestUtilities.isNativeEventsEnabled(driver));

driver.get(pages.javascriptPage);

WebElement keyReporter = driver.findElement(By.id("keyReporter"));

getBuilder(driver).click(keyReporter).sendKeys("abc def").perform();
assertThat(keyReporter.getAttribute("value"), is("abc def"));

getBuilder(driver).click(keyReporter)
.keyDown(Keys.CONTROL)
.sendKeys("a")
.keyUp(Keys.CONTROL)
.sendKeys(Keys.DELETE)
.perform();

assertThat(keyReporter.getAttribute("value"), is(""));
}

private void assertBackgroundColor(WebElement el, Colors expected) {
Color actual = Color.fromString(el.getCssValue("background-color"));
assertThat(actual, is(expected.getColorValue()));
Expand Down
10 changes: 5 additions & 5 deletions javascript/firefox-driver/js/firefoxDriver.js
Original file line number Diff line number Diff line change
Expand Up @@ -1333,6 +1333,11 @@ FirefoxDriver.prototype.mouseClick = function(respond, parameters) {

Utils.waitForNativeEventsProcessing(elementForNode, Utils.getNativeEvents(), dummyIndicator, this.jsTimer);

if (bot.dom.isEditable(elementForNode) && elementForNode.value !== undefined) {
goog.dom.selection.setCursorPosition(
elementForNode, elementForNode.value.length);
}

} else {
throw generateErrorForNativeEvents(this.enableNativeEvents, nativeMouse, node);
}
Expand Down Expand Up @@ -1383,11 +1388,6 @@ FirefoxDriver.prototype.sendKeysToActiveElement = function(respond, parameters)

var currentlyActiveElement = Utils.getActiveElement(respond.session.getDocument());

if (bot.dom.isEditable(currentlyActiveElement) && currentlyActiveElement.value !== undefined) {
goog.dom.selection.setCursorPosition(
currentlyActiveElement, currentlyActiveElement.value.length);
}

var useElement = currentlyActiveElement;
var tagName = useElement.tagName.toLowerCase();
if (tagName == 'body' && useElement.ownerDocument.defaultView.frameElement) {
Expand Down
5 changes: 5 additions & 0 deletions javascript/firefox-driver/js/syntheticMouse.js
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,11 @@ SyntheticMouse.prototype.click = function(target) {

bot.action.click(element, this.lastMousePosition, new bot.Mouse(null, keyboardState));

if (bot.dom.isEditable(element) && element.value !== undefined) {
goog.dom.selection.setCursorPosition(
element, element.value.length);
}

this.lastElement = element;

return SyntheticMouse.newResponse(bot.ErrorCode.SUCCESS, 'ok');
Expand Down

0 comments on commit 6da62ec

Please sign in to comment.