From c619032fad7707aee5e9fc8ecaed43419e41165d Mon Sep 17 00:00:00 2001 From: "jhawkins@chromium.org" Date: Tue, 2 Nov 2010 00:07:59 +0000 Subject: AutoFill: Fix scraping a label from a div table. BUG=61439 TEST=FormManagerTest.LabelsInferredFromDivTable Review URL: http://codereview.chromium.org/4248002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@64691 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome/renderer/form_manager.cc | 30 ++++++++++++++--- chrome/renderer/form_manager_browsertest.cc | 52 +++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 4 deletions(-) (limited to 'chrome/renderer') diff --git a/chrome/renderer/form_manager.cc b/chrome/renderer/form_manager.cc index 52bc6cf..265d0c2 100644 --- a/chrome/renderer/form_manager.cc +++ b/chrome/renderer/form_manager.cc @@ -190,6 +190,26 @@ string16 InferLabelFromTable( } // Helper for |InferLabelForElement()| that infers a label, if possible, from +// a surrounding div table. +// Eg.
Some Text
+string16 InferLabelFromDivTable( + const WebFormControlElement& element) { + WebNode parent = element.parentNode(); + while (!parent.isNull() && parent.isElementNode() && + !parent.to().hasTagName("div")) + parent = parent.parentNode(); + + if (parent.isNull() || !parent.isElementNode()) + return string16(); + + WebElement e = parent.to(); + if (e.isNull() || !e.hasTagName("div")) + return string16(); + + return FindChildText(e); +} + +// Helper for |InferLabelForElement()| that infers a label, if possible, from // a surrounding definition list. // Eg.
Some Text
// Eg.
Some Text
@@ -702,14 +722,16 @@ string16 FormManager::InferLabelForElement( string16 inferred_label = InferLabelFromPrevious(element); // If we didn't find a label, check for table cell case. - if (inferred_label.empty()) { + if (inferred_label.empty()) inferred_label = InferLabelFromTable(element); - } + + // If we didn't find a label, check for div table case. + if (inferred_label.empty()) + inferred_label = InferLabelFromDivTable(element); // If we didn't find a label, check for definition list case. - if (inferred_label.empty()) { + if (inferred_label.empty()) inferred_label = InferLabelFromDefinitionList(element); - } return inferred_label; } diff --git a/chrome/renderer/form_manager_browsertest.cc b/chrome/renderer/form_manager_browsertest.cc index 7e6bc6a..76ff574 100644 --- a/chrome/renderer/form_manager_browsertest.cc +++ b/chrome/renderer/form_manager_browsertest.cc @@ -1381,6 +1381,58 @@ TEST_F(FormManagerTest, LabelsInferredWithImageTags) { fields[5]); } +TEST_F(FormManagerTest, LabelsInferredFromDivTable) { + LoadHTML("
" + "
First Name:
" + " " + " " + " " + "
" + "
Last Name:
" + " " + " " + " " + "
" + "" + "
"); + + WebFrame* web_frame = GetMainFrame(); + ASSERT_NE(static_cast(NULL), web_frame); + + FormManager form_manager; + form_manager.ExtractForms(web_frame); + + std::vector 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& 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"), + string16(), + ASCIIToUTF16("text"), + 20), + fields[1]); + EXPECT_EQ(FormField(string16(), + ASCIIToUTF16("reply-send"), + ASCIIToUTF16("Send"), + ASCIIToUTF16("submit"), + 0), + fields[2]); +} + TEST_F(FormManagerTest, FillFormMaxLength) { LoadHTML("
" " " -- cgit v1.1