summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/renderer')
-rw-r--r--chrome/renderer/form_manager.cc11
-rw-r--r--chrome/renderer/form_manager_unittest.cc43
-rw-r--r--chrome/renderer/render_view.cc10
-rw-r--r--chrome/renderer/render_view.h4
-rw-r--r--chrome/renderer/translate_helper.cc3
5 files changed, 67 insertions, 4 deletions
diff --git a/chrome/renderer/form_manager.cc b/chrome/renderer/form_manager.cc
index 19ae004..59704d1 100644
--- a/chrome/renderer/form_manager.cc
+++ b/chrome/renderer/form_manager.cc
@@ -45,13 +45,16 @@ namespace {
// it's not necessary.
const size_t kRequiredAutoFillFields = 3;
-// Returns the node value of the first child of |element| if the first child
-// is text. This is faster alternative to |innerText()| for performance
-// critical operations when the child structure of element is known.
+// Returns the node value of the first offspring of |element| that is a text
+// node. This is a faster alternative to |innerText()| for performance
+// critical operations when the child structure of |element| is known.
string16 GetChildText(const WebElement& element) {
string16 element_text;
WebNode child = element.firstChild();
- if (!child.isNull() && child.isTextNode()) {
+ // Find the text node.
+ while (!child.isNull() && !child.isTextNode())
+ child = child.firstChild();
+ if (!child.isNull()) {
element_text = child.nodeValue();
TrimWhitespace(element_text, TRIM_ALL, &element_text);
}
diff --git a/chrome/renderer/form_manager_unittest.cc b/chrome/renderer/form_manager_unittest.cc
index 15f548f..2f37362 100644
--- a/chrome/renderer/form_manager_unittest.cc
+++ b/chrome/renderer/form_manager_unittest.cc
@@ -466,6 +466,49 @@ TEST_F(FormManagerTest, Labels) {
fields[2]);
}
+TEST_F(FormManagerTest, LabelsWithSpans) {
+ LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
+ " <LABEL for=\"firstname\"><span>First name: </span></LABEL>"
+ " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>"
+ " <LABEL for=\"lastname\"><span>Last name: </span></LABEL>"
+ " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>"
+ " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>"
+ "</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(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")),
+ 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]);
+}
+
// This test is different from FormManagerTest.Labels in that the label elements
// for= attribute is set to the name of the form control element it is a label
// for instead of the id of the form control element. This is invalid because
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index f744ce1..07eb0e6 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -4945,6 +4945,16 @@ bool RenderView::ScheduleFileChooser(
return true;
}
+void RenderView::OnPageTranslated() {
+ WebFrame* frame = webview()->mainFrame();
+ if (!frame)
+ return;
+
+ // The page is translated, so try to extract the form data again.
+ form_manager_.ExtractForms(frame);
+ SendForms(frame);
+}
+
WebKit::WebGeolocationService* RenderView::geolocationService() {
if (!geolocation_dispatcher_.get())
geolocation_dispatcher_.reset(new GeolocationDispatcher(this));
diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h
index d8bb27a..5d55af9 100644
--- a/chrome/renderer/render_view.h
+++ b/chrome/renderer/render_view.h
@@ -515,6 +515,10 @@ class RenderView : public RenderWidget,
bool ScheduleFileChooser(const ViewHostMsg_RunFileChooser_Params& params,
WebKit::WebFileChooserCompletion* completion);
+ // Called when the translate helper has finished translating the page. We use
+ // this signal to re-scan the page for forms.
+ void OnPageTranslated();
+
// The language code used when the page language is unknown.
static const char* const kUnknownLanguageCode;
diff --git a/chrome/renderer/translate_helper.cc b/chrome/renderer/translate_helper.cc
index d6d8569..1fea5b7 100644
--- a/chrome/renderer/translate_helper.cc
+++ b/chrome/renderer/translate_helper.cc
@@ -196,6 +196,9 @@ void TranslateHelper::CheckTranslateStatus() {
translation_pending_ = false;
+ // Notify the renderer we are done.
+ render_view_->OnPageTranslated();
+
// Notify the browser we are done.
render_view_->Send(new ViewHostMsg_PageTranslated(
render_view_->routing_id(), render_view_->page_id(),