summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordhollowa@chromium.org <dhollowa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-03-30 19:35:36 +0000
committerdhollowa@chromium.org <dhollowa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-03-30 19:35:36 +0000
commit3cd488a822976fd97aeb7e5237e483100a24fa12 (patch)
treefdb79cd23539dd9eaf2c97810761e22ca5a53d45
parent434eba616e4b61c9a2b6547e20ec0fa4d7b8d635 (diff)
downloadchromium_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.cc24
-rw-r--r--chrome/renderer/form_manager_unittest.cc58
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