diff options
author | dhollowa@chromium.org <dhollowa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-30 19:35:36 +0000 |
---|---|---|
committer | dhollowa@chromium.org <dhollowa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-30 19:35:36 +0000 |
commit | 3cd488a822976fd97aeb7e5237e483100a24fa12 (patch) | |
tree | fdb79cd23539dd9eaf2c97810761e22ca5a53d45 | |
parent | 434eba616e4b61c9a2b6547e20ec0fa4d7b8d635 (diff) | |
download | chromium_src-3cd488a822976fd97aeb7e5237e483100a24fa12.zip chromium_src-3cd488a822976fd97aeb7e5237e483100a24fa12.tar.gz chromium_src-3cd488a822976fd97aeb7e5237e483100a24fa12.tar.bz2 |
Label scraping for AutoFill, tables.
Adds label scraping to AutoFill where labels reside in tables. Infers labels
from surrounding context of input fields in the WebKit DOM. Specific case added
is:
- Table cell element containing text preceding INPUT element contained in a table cell.
Eg. <TR><TD>First name:</TD><TD><INPUT type="text" id="firstname" value="John"/></TD></TR>
BUG=33031
TEST=FormManagerTest.LabelsFromInferredTableCell
Review URL: http://codereview.chromium.org/1517005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@43121 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/renderer/form_manager.cc | 24 | ||||
-rw-r--r-- | chrome/renderer/form_manager_unittest.cc | 58 |
2 files changed, 80 insertions, 2 deletions
diff --git a/chrome/renderer/form_manager.cc b/chrome/renderer/form_manager.cc index 8206d29..5413963 100644 --- a/chrome/renderer/form_manager.cc +++ b/chrome/renderer/form_manager.cc @@ -286,5 +286,29 @@ string16 FormManager::InferLabelForElement( } } + // If we didn't find paragraph, check for table cell case. + // Eg. <tr><td>Some Text</td><td><input ...></td></tr> + if (inferred_label.empty()) { + WebNode parent = element.parentNode(); + if (!parent.isNull() && parent.isElementNode()) { + WebElement element = parent.toElement<WebElement>(); + if (element.hasTagName("td")) { + previous = parent.previousSibling(); + + // Skip by any intervening text nodes. + while (!previous.isNull() && previous.isTextNode()) + previous = previous.previousSibling(); + + if (!previous.isNull() && previous.isElementNode()) { + element = previous.toElement<WebElement>(); + if (element.hasTagName("td")) { + inferred_label = element.innerText(); + TrimWhitespace(inferred_label, TRIM_ALL, &inferred_label); + } + } + } + } + } + return inferred_label; } diff --git a/chrome/renderer/form_manager_unittest.cc b/chrome/renderer/form_manager_unittest.cc index 3b57d98..3c1393f 100644 --- a/chrome/renderer/form_manager_unittest.cc +++ b/chrome/renderer/form_manager_unittest.cc @@ -417,7 +417,7 @@ TEST_F(FormManagerTest, Labels) { fields[2]); } -TEST_F(FormManagerTest, LabelsFromInferredText) { +TEST_F(FormManagerTest, LabelsInferredFromText) { LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" " First name:" " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" @@ -460,7 +460,7 @@ TEST_F(FormManagerTest, LabelsFromInferredText) { fields[2]); } -TEST_F(FormManagerTest, LabelsFromInferredParagraph) { +TEST_F(FormManagerTest, LabelsInferredFromParagraph) { LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" " <P>First name:</P><INPUT type=\"text\" " " id=\"firstname\" value=\"John\"/>" @@ -503,4 +503,58 @@ TEST_F(FormManagerTest, LabelsFromInferredParagraph) { fields[2]); } +TEST_F(FormManagerTest, LabelsInferredFromTableCell) { + LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" + "<TABLE>" + " <TR>" + " <TD>First name:</TD>" + " <TD><INPUT type=\"text\" id=\"firstname\" value=\"John\"/></TD>" + " </TR>" + " <TR>" + " <TD>Last name:</TD>" + " <TD><INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/></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.GetForms(&forms, FormManager::REQUIRE_NONE); + 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")), + fields[0]); + EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"), + ASCIIToUTF16("lastname"), + ASCIIToUTF16("Smith"), + ASCIIToUTF16("text")), + fields[1]); + EXPECT_EQ(FormField(string16(), + ASCIIToUTF16("reply-send"), + ASCIIToUTF16("Send"), + ASCIIToUTF16("submit")), + fields[2]); +} + } // namespace |