diff options
author | jhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-29 19:55:14 +0000 |
---|---|---|
committer | jhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-29 19:55:14 +0000 |
commit | 4b4a4a74bf5d9c6c8e271b035bdf9d2e8117c78e (patch) | |
tree | 31357eb416ce2bc3db94681f4ddd1e57a8d92097 /chrome/renderer | |
parent | 68437a62a1ed8210bf95767bab9dc713536450e5 (diff) | |
download | chromium_src-4b4a4a74bf5d9c6c8e271b035bdf9d2e8117c78e.zip chromium_src-4b4a4a74bf5d9c6c8e271b035bdf9d2e8117c78e.tar.gz chromium_src-4b4a4a74bf5d9c6c8e271b035bdf9d2e8117c78e.tar.bz2 |
AutoFill: Skip past intervening empty TDs when parsing labels.
BUG=57107
TEST=FormStructure.LabelsInferredFromTableEmptyTDs
Review URL: http://codereview.chromium.org/4146014
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@64470 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r-- | chrome/renderer/form_manager.cc | 29 | ||||
-rw-r--r-- | chrome/renderer/form_manager_browsertest.cc | 69 |
2 files changed, 86 insertions, 12 deletions
diff --git a/chrome/renderer/form_manager.cc b/chrome/renderer/form_manager.cc index 446cbc9..092fa4b 100644 --- a/chrome/renderer/form_manager.cc +++ b/chrome/renderer/form_manager.cc @@ -163,22 +163,27 @@ string16 InferLabelFromTable( !parent.to<WebElement>().hasTagName("td")) parent = parent.parentNode(); - if (!parent.isNull() && parent.isElementNode()) { - WebElement element = parent.to<WebElement>(); - if (element.hasTagName("td")) { - WebNode previous = parent.previousSibling(); + if (parent.isNull() || !parent.isElementNode()) + return string16(); - // Skip by any intervening text nodes. - while (!previous.isNull() && previous.isTextNode()) - previous = previous.previousSibling(); + WebElement e = parent.to<WebElement>(); + if (e.isNull() || !e.hasTagName("td")) + return string16(); - if (!previous.isNull() && previous.isElementNode()) { - element = previous.to<WebElement>(); - if (element.hasTagName("td")) { - inferred_label = FindChildText(element); - } + // Check all previous siblings, skipping non-element nodes, until we find a + // non-empty text block. + WebNode previous = parent.previousSibling(); + while (!previous.isNull()) { + if (previous.isElementNode()) { + e = previous.to<WebElement>(); + if (e.hasTagName("td")) { + inferred_label = FindChildText(e); + if (!inferred_label.empty()) + break; } } + + previous = previous.previousSibling(); } return inferred_label; diff --git a/chrome/renderer/form_manager_browsertest.cc b/chrome/renderer/form_manager_browsertest.cc index a4fe748..1ee9935 100644 --- a/chrome/renderer/form_manager_browsertest.cc +++ b/chrome/renderer/form_manager_browsertest.cc @@ -1116,6 +1116,75 @@ TEST_F(FormManagerTest, LabelsInferredFromTableCellNested) { fields[2]); } +TEST_F(FormManagerTest, LabelsInferredFromTableEmptyTDs) { + LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" + "<TABLE>" + " <TR>" + " <TD>" + " <SPAN>*</SPAN>" + " <B>First Name</B>" + " </TD>" + " <TD></TD>" + " <TD>" + " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" + " </TD>" + " </TR>" + " <TR>" + " <TD>" + " <SPAN>*</SPAN>" + " <B>Last Name</B>" + " </TD>" + " <TD></TD>" + " <TD>" + " <INPUT type=\"text\" id=\"lastname\" value=\"Milton\"/>" + " </TD>" + " </TR>" + " <TR>" + " <TD></TD>" + " <TD>" + " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" + " </TD>" + " </TR>" + "</TABLE>" + "</FORM>"); + + WebFrame* web_frame = GetMainFrame(); + ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); + + FormManager form_manager; + form_manager.ExtractForms(web_frame); + + std::vector<FormData> forms; + form_manager.GetFormsInFrame(web_frame, FormManager::REQUIRE_NONE, &forms); + ASSERT_EQ(1U, forms.size()); + + const FormData& form = forms[0]; + EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); + EXPECT_EQ(GURL(web_frame->url()), form.origin); + EXPECT_EQ(GURL("http://cnn.com"), form.action); + + const std::vector<FormField>& fields = form.fields; + ASSERT_EQ(3U, fields.size()); + EXPECT_EQ(FormField(ASCIIToUTF16("*First Name"), + ASCIIToUTF16("firstname"), + ASCIIToUTF16("John"), + ASCIIToUTF16("text"), + 20), + fields[0]); + EXPECT_EQ(FormField(ASCIIToUTF16("*Last Name"), + ASCIIToUTF16("lastname"), + ASCIIToUTF16("Milton"), + ASCIIToUTF16("text"), + 20), + fields[1]); + EXPECT_EQ(FormField(string16(), + ASCIIToUTF16("reply-send"), + ASCIIToUTF16("Send"), + ASCIIToUTF16("submit"), + 0), + fields[2]); +} + TEST_F(FormManagerTest, LabelsInferredFromDefinitionList) { LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" "<DL>" |