diff options
author | jhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-02 20:47:56 +0000 |
---|---|---|
committer | jhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-02 20:47:56 +0000 |
commit | a755dc2df6712d2965b3ea2e6a0e90fe5fb3d0a3 (patch) | |
tree | 0b0c9b4f093989ee6ea2b3d7a50b92b4fc51e071 /chrome/renderer | |
parent | 5811d97aae3f64e740b0163d02486d2154a9c472 (diff) | |
download | chromium_src-a755dc2df6712d2965b3ea2e6a0e90fe5fb3d0a3.zip chromium_src-a755dc2df6712d2965b3ea2e6a0e90fe5fb3d0a3.tar.gz chromium_src-a755dc2df6712d2965b3ea2e6a0e90fe5fb3d0a3.tar.bz2 |
Implement FormManager::LabelForElement and use this to store the field labels.
BUG=none
TEST=FormManagerTest.Labels
Review URL: http://codereview.chromium.org/660154
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@40416 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r-- | chrome/renderer/form_manager.cc | 23 | ||||
-rw-r--r-- | chrome/renderer/form_manager.h | 3 | ||||
-rw-r--r-- | chrome/renderer/form_manager_unittest.cc | 95 |
3 files changed, 113 insertions, 8 deletions
diff --git a/chrome/renderer/form_manager.cc b/chrome/renderer/form_manager.cc index 743d95c..9731e7a 100644 --- a/chrome/renderer/form_manager.cc +++ b/chrome/renderer/form_manager.cc @@ -7,15 +7,23 @@ #include "base/logging.h" #include "base/string_util.h" #include "base/stl_util-inl.h" +#include "third_party/WebKit/WebKit/chromium/public/WebDocument.h" +#include "third_party/WebKit/WebKit/chromium/public/WebElement.h" #include "third_party/WebKit/WebKit/chromium/public/WebFrame.h" +#include "third_party/WebKit/WebKit/chromium/public/WebLabelElement.h" #include "third_party/WebKit/WebKit/chromium/public/WebNode.h" +#include "third_party/WebKit/WebKit/chromium/public/WebNodeList.h" #include "third_party/WebKit/WebKit/chromium/public/WebString.h" #include "third_party/WebKit/WebKit/chromium/public/WebVector.h" +using WebKit::WebDocument; +using WebKit::WebElement; using WebKit::WebFormElement; using WebKit::WebFrame; using WebKit::WebInputElement; +using WebKit::WebLabelElement; using WebKit::WebNode; +using WebKit::WebNodeList; using WebKit::WebString; using WebKit::WebVector; @@ -175,6 +183,7 @@ void FormManager::FormElementToFormData(WebFrame* frame, !input_element.isEnabledFormControl()) continue; + form->labels.push_back(LabelForElement(input_element)); form->elements.push_back(input_element.nameForAutofill()); form->values.push_back(input_element.value()); @@ -185,3 +194,17 @@ void FormManager::FormElementToFormData(WebFrame* frame, form->submit = input_element.nameForAutofill(); } } + +// static +string16 FormManager::LabelForElement(const WebInputElement& element) { + WebNodeList labels = element.document().getElementsByTagName("label"); + for (unsigned i = 0; i < labels.length(); ++i) { + WebElement e = labels.item(i).toElement<WebElement>(); + if (e.hasTagName("label")) { + WebLabelElement label = e.toElement<WebLabelElement>(); + if (label.correspondingControl() == element) + return label.innerText(); + } + } + return string16(); +} diff --git a/chrome/renderer/form_manager.h b/chrome/renderer/form_manager.h index 209c93c..9e7abf8 100644 --- a/chrome/renderer/form_manager.h +++ b/chrome/renderer/form_manager.h @@ -75,6 +75,9 @@ class FormManager { RequirementsMask requirements, FormData* form); + // Returns the corresponding label for |element|. + static string16 LabelForElement(const WebKit::WebInputElement& element); + // The map of form elements. WebFrameFormElementMap form_elements_map_; diff --git a/chrome/renderer/form_manager_unittest.cc b/chrome/renderer/form_manager_unittest.cc index 4a5e52a..d819096 100644 --- a/chrome/renderer/form_manager_unittest.cc +++ b/chrome/renderer/form_manager_unittest.cc @@ -41,7 +41,12 @@ TEST_F(FormManagerTest, ExtractForms) { EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); EXPECT_EQ(GURL(web_frame->url()), form.origin); EXPECT_EQ(GURL("http://cnn.com"), form.action); - EXPECT_EQ(ASCIIToUTF16("reply-send"), form.submit); + + const std::vector<string16>& labels = form.labels; + ASSERT_EQ(3U, labels.size()); + EXPECT_EQ(string16(), labels[0]); + EXPECT_EQ(string16(), labels[1]); + EXPECT_EQ(string16(), labels[2]); const std::vector<string16>& elements = form.elements; ASSERT_EQ(3U, elements.size()); @@ -81,7 +86,11 @@ TEST_F(FormManagerTest, ExtractMultipleForms) { EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); EXPECT_EQ(GURL(web_frame->url()), form.origin); EXPECT_EQ(GURL("http://cnn.com"), form.action); - EXPECT_EQ(ASCIIToUTF16("reply-send"), form.submit); + + const std::vector<string16>& labels = form.labels; + ASSERT_EQ(2U, labels.size()); + EXPECT_EQ(string16(), labels[0]); + EXPECT_EQ(string16(), labels[1]); const std::vector<string16>& elements = form.elements; ASSERT_EQ(2U, elements.size()); @@ -98,7 +107,11 @@ TEST_F(FormManagerTest, ExtractMultipleForms) { EXPECT_EQ(ASCIIToUTF16("TestForm2"), form2.name); EXPECT_EQ(GURL(web_frame->url()), form2.origin); EXPECT_EQ(GURL("http://zoo.com"), form2.action); - EXPECT_EQ(ASCIIToUTF16("second"), form2.submit); + + const std::vector<string16>& labels2 = form2.labels; + ASSERT_EQ(2U, labels2.size()); + EXPECT_EQ(string16(), labels2[0]); + EXPECT_EQ(string16(), labels2[1]); const std::vector<string16>& elements2 = form2.elements; ASSERT_EQ(2U, elements2.size()); @@ -157,7 +170,11 @@ TEST_F(FormManagerTest, GetFormsAutocomplete) { EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); EXPECT_EQ(GURL(web_frame->url()), form.origin); EXPECT_EQ(GURL("http://abc.com"), form.action); - EXPECT_EQ(ASCIIToUTF16("reply"), form.submit); + + const std::vector<string16>& labels = form.labels; + ASSERT_EQ(2U, labels.size()); + EXPECT_EQ(string16(), labels[0]); + EXPECT_EQ(string16(), labels[1]); const std::vector<string16>& elements = form.elements; ASSERT_EQ(2U, elements.size()); @@ -192,7 +209,11 @@ TEST_F(FormManagerTest, GetFormsElementsEnabled) { EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); EXPECT_EQ(GURL(web_frame->url()), form.origin); EXPECT_EQ(GURL("http://xyz.com"), form.action); - EXPECT_EQ(ASCIIToUTF16("submit"), form.submit); + + const std::vector<string16>& labels = form.labels; + ASSERT_EQ(2U, labels.size()); + EXPECT_EQ(string16(), labels[0]); + EXPECT_EQ(string16(), labels[1]); const std::vector<string16>& elements = form.elements; ASSERT_EQ(2U, elements.size()); @@ -234,7 +255,12 @@ TEST_F(FormManagerTest, FindForm) { EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); EXPECT_EQ(GURL(web_frame->url()), form.origin); EXPECT_EQ(GURL("http://buh.com"), form.action); - EXPECT_EQ(ASCIIToUTF16("reply-send"), form.submit); + + const std::vector<string16>& labels = form.labels; + ASSERT_EQ(3U, labels.size()); + EXPECT_EQ(string16(), labels[0]); + EXPECT_EQ(string16(), labels[1]); + EXPECT_EQ(string16(), labels[2]); const std::vector<string16>& elements = form.elements; ASSERT_EQ(3U, elements.size()); @@ -278,7 +304,12 @@ TEST_F(FormManagerTest, FillForm) { EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); EXPECT_EQ(GURL(web_frame->url()), form.origin); EXPECT_EQ(GURL("http://buh.com"), form.action); - EXPECT_EQ(ASCIIToUTF16("reply-send"), form.submit); + + const std::vector<string16>& labels = form.labels; + ASSERT_EQ(3U, labels.size()); + EXPECT_EQ(string16(), labels[0]); + EXPECT_EQ(string16(), labels[1]); + EXPECT_EQ(string16(), labels[2]); const std::vector<string16>& elements = form.elements; ASSERT_EQ(3U, elements.size()); @@ -304,7 +335,12 @@ TEST_F(FormManagerTest, FillForm) { EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); EXPECT_EQ(GURL(web_frame->url()), form2.origin); EXPECT_EQ(GURL("http://buh.com"), form2.action); - EXPECT_EQ(ASCIIToUTF16("reply-send"), form2.submit); + + const std::vector<string16>& labels2 = form2.labels; + ASSERT_EQ(3U, labels2.size()); + EXPECT_EQ(string16(), labels2[0]); + EXPECT_EQ(string16(), labels2[1]); + EXPECT_EQ(string16(), labels2[2]); const std::vector<string16>& elements2 = form2.elements; ASSERT_EQ(3U, elements2.size()); @@ -344,3 +380,46 @@ TEST_F(FormManagerTest, Reset) { form_manager.GetForms(&forms, FormManager::REQUIRE_NONE); ASSERT_EQ(0U, forms.size()); } + +TEST_F(FormManagerTest, Labels) { + LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" + " <LABEL for=\"firstname\"> First name: </LABEL>" + " <INPUT type=\"text\" id=\"firstname\" value=\"John\">" + " <LABEL for=\"lastname\"> Last name: </LABEL>" + " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\">" + " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\">" + "</FORM>"); + + WebFrame* web_frame = GetMainFrame(); + ASSERT_TRUE(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<string16>& labels = form.labels; + ASSERT_EQ(3U, labels.size()); + EXPECT_EQ(ASCIIToUTF16("First name:"), labels[0]); + EXPECT_EQ(ASCIIToUTF16("Last name:"), labels[1]); + EXPECT_EQ(string16(), labels[2]); + + const std::vector<string16>& elements = form.elements; + ASSERT_EQ(3U, elements.size()); + EXPECT_EQ(ASCIIToUTF16("firstname"), elements[0]); + EXPECT_EQ(ASCIIToUTF16("lastname"), elements[1]); + EXPECT_EQ(ASCIIToUTF16("reply-send"), elements[2]); + + const std::vector<string16>& values = form.values; + ASSERT_EQ(3U, values.size()); + EXPECT_EQ(ASCIIToUTF16("John"), values[0]); + EXPECT_EQ(ASCIIToUTF16("Smith"), values[1]); + EXPECT_EQ(ASCIIToUTF16("Send"), values[2]); +} |