summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkkania@chromium.org <kkania@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-04 23:39:20 +0000
committerkkania@chromium.org <kkania@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-04 23:39:20 +0000
commit9c3a4806e9d11caa68be99f8819bb01575ea53ec (patch)
treee4b217734b0e49fa942439b6322ee3e0f6e2874d
parentc44d8d39ba494047175928e4f83fa2d1ffbe7f60 (diff)
downloadchromium_src-9c3a4806e9d11caa68be99f8819bb01575ea53ec.zip
chromium_src-9c3a4806e9d11caa68be99f8819bb01575ea53ec.tar.gz
chromium_src-9c3a4806e9d11caa68be99f8819bb01575ea53ec.tar.bz2
In chromedriver, if sending keys an editable element (with contentEditable),
focus the root editable element. BUG=85243 TEST=none TBR=dennisjeffrey Review URL: http://codereview.chromium.org/7278030 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@91481 0039d316-1c4b-4281-b951-d872f2087c98
-rwxr-xr-xchrome/test/webdriver/chromedriver_tests.py18
-rw-r--r--chrome/test/webdriver/commands/webelement_commands.cc17
-rw-r--r--chrome/test/webdriver/session.cc24
-rw-r--r--chrome/test/webdriver/test_page.html4
4 files changed, 44 insertions, 19 deletions
diff --git a/chrome/test/webdriver/chromedriver_tests.py b/chrome/test/webdriver/chromedriver_tests.py
index 6bf8482..5cf704d 100755
--- a/chrome/test/webdriver/chromedriver_tests.py
+++ b/chrome/test/webdriver/chromedriver_tests.py
@@ -458,6 +458,24 @@ class MouseTest(unittest.TestCase):
self.assertTrue(self._driver.execute_script('return window.success'))
+class TypingTest(unittest.TestCase):
+
+ def setUp(self):
+ self._launcher = ChromeDriverLauncher(root_path=os.path.dirname(__file__))
+ self._driver = WebDriver(self._launcher.GetURL(), {})
+ self._driver.get(self._launcher.GetURL() + '/test_page.html')
+
+ def tearDown(self):
+ self._driver.quit()
+ self._launcher.Kill()
+
+ # See http://crbug.com/85243.
+ def testCanSendKeysToDescendantOfEditingHost(self):
+ self._driver.find_element_by_name('editable_child').send_keys('moo')
+ text = self._driver.find_element_by_name('editable').text
+ self.assertEquals('mooeditable', text)
+
+
class UrlBaseTest(unittest.TestCase):
"""Tests that the server can be configured for a different URL base."""
diff --git a/chrome/test/webdriver/commands/webelement_commands.cc b/chrome/test/webdriver/commands/webelement_commands.cc
index 1c8b50f..0ea0c01 100644
--- a/chrome/test/webdriver/commands/webelement_commands.cc
+++ b/chrome/test/webdriver/commands/webelement_commands.cc
@@ -518,21 +518,16 @@ Error* ElementValueCommand::HasAttributeWithLowerCaseValueASCII(
Value* unscoped_value = NULL;
Error* error = session_->GetAttribute(element, key, &unscoped_value);
scoped_ptr<Value> scoped_value(unscoped_value);
- unscoped_value = NULL;
-
- if (error) {
+ if (error)
return error;
- }
std::string actual_value;
- if (!scoped_value->GetAsString(&actual_value)) {
- return new Error(
- kUnknownError,
- base::StringPrintf("Attribute '%s' did not have a string value",
- key.c_str()));
+ if (scoped_value->GetAsString(&actual_value)) {
+ *result = LowerCaseEqualsASCII(actual_value, value.c_str());
+ } else {
+ // Note we do not handle converting a number to a string.
+ *result = false;
}
-
- *result = LowerCaseEqualsASCII(actual_value, value.c_str());
return NULL;
}
diff --git a/chrome/test/webdriver/session.cc b/chrome/test/webdriver/session.cc
index 0b0c8e7..e59e7b8 100644
--- a/chrome/test/webdriver/session.cc
+++ b/chrome/test/webdriver/session.cc
@@ -165,16 +165,24 @@ Error* Session::SendKeys(const WebElementId& element, const string16& keys) {
ListValue args;
args.Append(element.ToValue());
- // This method will first check if the element we want to send the keys to is
- // already focused, if not it will try to focus on it first.
+ // Focus the element if not focused already. If it is an editable element,
+ // focus the editing host element instead. Descendants of an editing host
+ // element cannot be focused in chrome.
+ // See http://www.w3.org/TR/html5/editing.html#attr-contenteditable.
// TODO(jleyba): Update this to use the correct atom.
- std::string script = "if(document.activeElement != arguments[0]) {"
- " if(document.activeElement)"
- " document.activeElement.blur();"
- " arguments[0].focus();"
- "}";
+ const char* kFocusScript =
+ "var elem = arguments[0];"
+ "if (elem.isContentEditable) {"
+ " while (elem.parentNode && elem.parentNode.isContentEditable)"
+ " elem = elem.parentNode;"
+ "}"
+ "if (elem != document.activeElement) {"
+ " if(document.activeElement)"
+ " document.activeElement.blur();"
+ " elem.focus();"
+ "}";
Value* unscoped_result = NULL;
- error = ExecuteScript(script, &args, &unscoped_result);
+ error = ExecuteScript(kFocusScript, &args, &unscoped_result);
if (error) {
error->AddDetails("Failed to focus element before sending keys");
return error;
diff --git a/chrome/test/webdriver/test_page.html b/chrome/test/webdriver/test_page.html
index 5f4fbeb..671ebae 100644
--- a/chrome/test/webdriver/test_page.html
+++ b/chrome/test/webdriver/test_page.html
@@ -22,4 +22,8 @@ function succeed() {
<select><option>1</option><option name="option">2</option></select>
+<div name="editable" contentEditable>
+ <div name="editable_child">editable</div>
+</div>
+
</html>