diff options
author | kkania@chromium.org <kkania@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-04 23:39:20 +0000 |
---|---|---|
committer | kkania@chromium.org <kkania@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-04 23:39:20 +0000 |
commit | 9c3a4806e9d11caa68be99f8819bb01575ea53ec (patch) | |
tree | e4b217734b0e49fa942439b6322ee3e0f6e2874d | |
parent | c44d8d39ba494047175928e4f83fa2d1ffbe7f60 (diff) | |
download | chromium_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-x | chrome/test/webdriver/chromedriver_tests.py | 18 | ||||
-rw-r--r-- | chrome/test/webdriver/commands/webelement_commands.cc | 17 | ||||
-rw-r--r-- | chrome/test/webdriver/session.cc | 24 | ||||
-rw-r--r-- | chrome/test/webdriver/test_page.html | 4 |
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> |