OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/string_util.h" | 5 #include "base/string_util.h" |
6 #include "base/utf_string_conversions.h" | 6 #include "base/utf_string_conversions.h" |
7 #include "chrome/renderer/form_manager.h" | 7 #include "chrome/renderer/form_manager.h" |
8 #include "chrome/test/render_view_test.h" | 8 #include "chrome/test/render_view_test.h" |
9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
10 #include "third_party/WebKit/WebKit/chromium/public/WebDocument.h" | 10 #include "third_party/WebKit/WebKit/chromium/public/WebDocument.h" |
(...skipping 14 matching lines...) Expand all Loading... |
25 using WebKit::WebInputElement; | 25 using WebKit::WebInputElement; |
26 using WebKit::WebNode; | 26 using WebKit::WebNode; |
27 using WebKit::WebString; | 27 using WebKit::WebString; |
28 using WebKit::WebVector; | 28 using WebKit::WebVector; |
29 | 29 |
30 using webkit_glue::FormData; | 30 using webkit_glue::FormData; |
31 using webkit_glue::FormField; | 31 using webkit_glue::FormField; |
32 | 32 |
33 namespace { | 33 namespace { |
34 | 34 |
35 typedef RenderViewTest FormManagerTest; | 35 class FormManagerTest : public RenderViewTest { |
| 36 public: |
| 37 // Load a single form from an HTML snippet. |
| 38 void LoadForm(const char* const html, FormData *form); |
| 39 |
| 40 // Test that we have extracted the default form data (disregarding the form |
| 41 // fields). |
| 42 void ExpectDefaultForm(const FormData& form); |
| 43 |
| 44 // Test that the form loaded from |html| has locale |locale|. |
| 45 void ExpectLocale(const char* const locale, const char* const html); |
| 46 }; |
| 47 |
| 48 void FormManagerTest::LoadForm(const char* const html, FormData *form) { |
| 49 LoadHTML(html); |
| 50 |
| 51 WebFrame* web_frame = GetMainFrame(); |
| 52 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); |
| 53 |
| 54 FormManager form_manager; |
| 55 form_manager.ExtractForms(web_frame); |
| 56 |
| 57 std::vector<FormData> forms; |
| 58 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); |
| 59 ASSERT_EQ(1U, forms.size()); |
| 60 |
| 61 *form = forms[0]; |
| 62 EXPECT_EQ(GURL(web_frame->url()), form->origin); |
| 63 } |
| 64 |
| 65 void FormManagerTest::ExpectDefaultForm(const FormData& form) { |
| 66 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); |
| 67 EXPECT_EQ(ASCIIToUTF16("post"), form.method); |
| 68 EXPECT_EQ(GURL("http://cnn.com"), form.action); |
| 69 EXPECT_EQ(std::string(), form.locale); |
| 70 } |
| 71 |
| 72 void FormManagerTest::ExpectLocale(const char* const locale, |
| 73 const char* const html) { |
| 74 FormData form; |
| 75 LoadForm(html, &form); |
| 76 EXPECT_EQ(locale, form.locale); |
| 77 } |
36 | 78 |
37 TEST_F(FormManagerTest, WebFormElementToFormData) { | 79 TEST_F(FormManagerTest, WebFormElementToFormData) { |
38 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | 80 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" |
39 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" | 81 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" |
40 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" | 82 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" |
41 " <INPUT type=\"hidden\" id=\"notvisible\" value=\"apple\"/>" | 83 " <INPUT type=\"hidden\" id=\"notvisible\" value=\"apple\"/>" |
42 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | 84 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" |
43 "</FORM>"); | 85 "</FORM>"); |
44 | 86 |
45 WebFrame* frame = GetMainFrame(); | 87 WebFrame* frame = GetMainFrame(); |
46 ASSERT_NE(static_cast<WebFrame*>(NULL), frame); | 88 ASSERT_NE(static_cast<WebFrame*>(NULL), frame); |
47 | 89 |
48 WebVector<WebFormElement> forms; | 90 WebVector<WebFormElement> forms; |
49 frame->forms(forms); | 91 frame->forms(forms); |
50 ASSERT_EQ(1U, forms.size()); | 92 ASSERT_EQ(1U, forms.size()); |
51 | 93 |
52 FormData form; | 94 FormData form; |
53 EXPECT_TRUE(FormManager::WebFormElementToFormData(forms[0], | 95 EXPECT_TRUE(FormManager::WebFormElementToFormData(forms[0], |
54 FormManager::REQUIRE_NONE, | 96 FormManager::REQUIRE_NONE, |
55 true, | 97 true, |
56 &form)); | 98 &form)); |
57 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
58 EXPECT_EQ(GURL(frame->url()), form.origin); | 99 EXPECT_EQ(GURL(frame->url()), form.origin); |
59 EXPECT_EQ(GURL("http://cnn.com"), form.action); | 100 ExpectDefaultForm(form); |
60 | 101 |
61 const std::vector<FormField>& fields = form.fields; | 102 const std::vector<FormField>& fields = form.fields; |
62 ASSERT_EQ(4U, fields.size()); | 103 ASSERT_EQ(4U, fields.size()); |
63 EXPECT_TRUE(fields[0].StrictlyEqualsHack( | 104 EXPECT_TRUE(fields[0].StrictlyEqualsHack( |
64 FormField(string16(), | 105 FormField(string16(), |
65 ASCIIToUTF16("firstname"), | 106 ASCIIToUTF16("firstname"), |
66 ASCIIToUTF16("John"), | 107 ASCIIToUTF16("John"), |
67 ASCIIToUTF16("text"), | 108 ASCIIToUTF16("text"), |
68 20))); | 109 20))); |
69 EXPECT_TRUE(fields[1].StrictlyEqualsHack( | 110 EXPECT_TRUE(fields[1].StrictlyEqualsHack( |
70 FormField(string16(), | 111 FormField(string16(), |
71 ASCIIToUTF16("lastname"), | 112 ASCIIToUTF16("lastname"), |
72 ASCIIToUTF16("Smith"), | 113 ASCIIToUTF16("Smith"), |
73 ASCIIToUTF16("text"), | 114 ASCIIToUTF16("text"), |
74 20))); | 115 20))); |
75 EXPECT_TRUE(fields[2].StrictlyEqualsHack( | 116 EXPECT_TRUE(fields[2].StrictlyEqualsHack( |
76 FormField(string16(), | 117 FormField(string16(), |
77 ASCIIToUTF16("notvisible"), | 118 ASCIIToUTF16("notvisible"), |
78 ASCIIToUTF16("apple"), | 119 ASCIIToUTF16("apple"), |
79 ASCIIToUTF16("hidden"), | 120 ASCIIToUTF16("hidden"), |
80 0))); | 121 0))); |
81 EXPECT_TRUE(fields[3].StrictlyEqualsHack( | 122 EXPECT_TRUE(fields[3].StrictlyEqualsHack( |
82 FormField(string16(), | 123 FormField(string16(), |
83 ASCIIToUTF16("reply-send"), | 124 ASCIIToUTF16("reply-send"), |
84 string16(), | 125 string16(), |
85 ASCIIToUTF16("submit"), | 126 ASCIIToUTF16("submit"), |
86 0))); | 127 0))); |
87 } | 128 } |
88 | 129 |
| 130 // Ensure that form locales are correctly determined from the DOM. |
| 131 // We are essentially duplicating a WebKit layout test here, but better safe |
| 132 // than sorry. |
| 133 TEST_F(FormManagerTest, FormLocale) { |
| 134 // Test the default behavior, when no locale is specified. |
| 135 ExpectLocale("", |
| 136 "<FORM>" |
| 137 " <INPUT type=\"text\" value=\"dummy\"/>" |
| 138 "</FORM>"); |
| 139 |
| 140 // Test that we correctly detect the locale when it is directly specified. |
| 141 ExpectLocale("fr-CA", |
| 142 "<FORM lang=\"fr-CA\">" |
| 143 " <INPUT type=\"text\" value=\"dummy\"/>" |
| 144 "</FORM>"); |
| 145 |
| 146 // Test that the locale is properly inherited. |
| 147 ExpectLocale("en-GB", |
| 148 "<DIV lang=\"en-GB\">" |
| 149 " <FORM>" |
| 150 " <INPUT type=\"text\" value=\"dummy\"/>" |
| 151 " </FORM>" |
| 152 "</DIV>"); |
| 153 |
| 154 // Test that inheritance stops properly. |
| 155 ExpectLocale("en-US", |
| 156 "<DIV lang=\"en-GB\">" |
| 157 " <FORM lang=\"en-US\">" |
| 158 " <INPUT type=\"text\" value=\"dummy\"/>" |
| 159 " </FORM>" |
| 160 "</DIV>"); |
| 161 |
| 162 // Test that we use the Content-Language meta tag as a fallback. |
| 163 ExpectLocale("en-GB", |
| 164 "<HTML>" |
| 165 " <HEAD>" |
| 166 " <META http-equiv=\"Content-Language\" content=\"en-GB\" />" |
| 167 " </HEAD>" |
| 168 " <FORM>" |
| 169 " <INPUT type=\"text\" value=\"dummy\"/>" |
| 170 " </FORM>" |
| 171 "</HTML>"); |
| 172 |
| 173 // WebKit does absolutely no validation of the lang attribute; we shouldn't |
| 174 // validate here either. |
| 175 ExpectLocale(" this is-not a meaningful_locale! ", |
| 176 "<FORM lang=\" this is-not a meaningful_locale! \">" |
| 177 " <INPUT type=\"text\" value=\"dummy\"/>" |
| 178 "</FORM>"); |
| 179 } |
| 180 |
89 TEST_F(FormManagerTest, ExtractForms) { | 181 TEST_F(FormManagerTest, ExtractForms) { |
90 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | 182 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" |
91 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" | 183 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" |
92 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" | 184 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" |
93 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | 185 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" |
94 "</FORM>"); | 186 "</FORM>"); |
95 | 187 |
96 WebFrame* web_frame = GetMainFrame(); | 188 WebFrame* web_frame = GetMainFrame(); |
97 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | 189 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); |
98 | 190 |
99 FormManager form_manager; | 191 FormManager form_manager; |
100 form_manager.ExtractForms(web_frame); | 192 form_manager.ExtractForms(web_frame); |
101 | 193 |
102 std::vector<FormData> forms; | 194 std::vector<FormData> forms; |
103 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | 195 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); |
104 ASSERT_EQ(1U, forms.size()); | 196 ASSERT_EQ(1U, forms.size()); |
105 | 197 |
106 const FormData& form = forms[0]; | 198 const FormData& form = forms[0]; |
107 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
108 EXPECT_EQ(GURL(web_frame->url()), form.origin); | 199 EXPECT_EQ(GURL(web_frame->url()), form.origin); |
109 EXPECT_EQ(GURL("http://cnn.com"), form.action); | 200 ExpectDefaultForm(form); |
110 | 201 |
111 const std::vector<FormField>& fields = form.fields; | 202 const std::vector<FormField>& fields = form.fields; |
112 ASSERT_EQ(3U, fields.size()); | 203 ASSERT_EQ(3U, fields.size()); |
113 EXPECT_EQ(FormField(string16(), | 204 EXPECT_EQ(FormField(string16(), |
114 ASCIIToUTF16("firstname"), | 205 ASCIIToUTF16("firstname"), |
115 ASCIIToUTF16("John"), | 206 ASCIIToUTF16("John"), |
116 ASCIIToUTF16("text"), | 207 ASCIIToUTF16("text"), |
117 20), | 208 20), |
118 fields[0]); | 209 fields[0]); |
119 EXPECT_EQ(FormField(string16(), | 210 EXPECT_EQ(FormField(string16(), |
(...skipping 25 matching lines...) Expand all Loading... |
145 | 236 |
146 FormManager form_manager; | 237 FormManager form_manager; |
147 form_manager.ExtractForms(web_frame); | 238 form_manager.ExtractForms(web_frame); |
148 | 239 |
149 std::vector<FormData> forms; | 240 std::vector<FormData> forms; |
150 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | 241 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); |
151 ASSERT_EQ(2U, forms.size()); | 242 ASSERT_EQ(2U, forms.size()); |
152 | 243 |
153 // First form. | 244 // First form. |
154 const FormData& form = forms[0]; | 245 const FormData& form = forms[0]; |
155 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
156 EXPECT_EQ(GURL(web_frame->url()), form.origin); | 246 EXPECT_EQ(GURL(web_frame->url()), form.origin); |
157 EXPECT_EQ(GURL("http://cnn.com"), form.action); | 247 ExpectDefaultForm(form); |
158 | 248 |
159 const std::vector<FormField>& fields = form.fields; | 249 const std::vector<FormField>& fields = form.fields; |
160 ASSERT_EQ(2U, fields.size()); | 250 ASSERT_EQ(2U, fields.size()); |
161 EXPECT_EQ(FormField(string16(), | 251 EXPECT_EQ(FormField(string16(), |
162 ASCIIToUTF16("firstname"), | 252 ASCIIToUTF16("firstname"), |
163 ASCIIToUTF16("John"), | 253 ASCIIToUTF16("John"), |
164 ASCIIToUTF16("text"), | 254 ASCIIToUTF16("text"), |
165 20), | 255 20), |
166 fields[0]); | 256 fields[0]); |
167 EXPECT_EQ(FormField(string16(), | 257 EXPECT_EQ(FormField(string16(), |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
232 form_manager.ExtractForms(web_frame); | 322 form_manager.ExtractForms(web_frame); |
233 | 323 |
234 forms.clear(); | 324 forms.clear(); |
235 form_manager.GetForms(FormManager::REQUIRE_AUTOCOMPLETE, &forms); | 325 form_manager.GetForms(FormManager::REQUIRE_AUTOCOMPLETE, &forms); |
236 ASSERT_EQ(1U, forms.size()); | 326 ASSERT_EQ(1U, forms.size()); |
237 | 327 |
238 const FormData& form = forms[0]; | 328 const FormData& form = forms[0]; |
239 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | 329 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); |
240 EXPECT_EQ(GURL(web_frame->url()), form.origin); | 330 EXPECT_EQ(GURL(web_frame->url()), form.origin); |
241 EXPECT_EQ(GURL("http://abc.com"), form.action); | 331 EXPECT_EQ(GURL("http://abc.com"), form.action); |
| 332 EXPECT_EQ(std::string(), form.locale); |
242 | 333 |
243 const std::vector<FormField>& fields = form.fields; | 334 const std::vector<FormField>& fields = form.fields; |
244 ASSERT_EQ(2U, fields.size()); | 335 ASSERT_EQ(2U, fields.size()); |
245 EXPECT_EQ(FormField(string16(), | 336 EXPECT_EQ(FormField(string16(), |
246 ASCIIToUTF16("lastname"), | 337 ASCIIToUTF16("lastname"), |
247 ASCIIToUTF16("Smith"), | 338 ASCIIToUTF16("Smith"), |
248 ASCIIToUTF16("text"), | 339 ASCIIToUTF16("text"), |
249 20), | 340 20), |
250 fields[0]); | 341 fields[0]); |
251 EXPECT_EQ(FormField(string16(), | 342 EXPECT_EQ(FormField(string16(), |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
616 | 707 |
617 // There should be no forms after the call to Reset. | 708 // There should be no forms after the call to Reset. |
618 form_manager.Reset(); | 709 form_manager.Reset(); |
619 | 710 |
620 forms.clear(); | 711 forms.clear(); |
621 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | 712 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); |
622 ASSERT_EQ(0U, forms.size()); | 713 ASSERT_EQ(0U, forms.size()); |
623 } | 714 } |
624 | 715 |
625 TEST_F(FormManagerTest, Labels) { | 716 TEST_F(FormManagerTest, Labels) { |
626 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | 717 FormData form; |
| 718 LoadForm("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" |
627 " <LABEL for=\"firstname\"> First name: </LABEL>" | 719 " <LABEL for=\"firstname\"> First name: </LABEL>" |
628 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" | 720 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" |
629 " <LABEL for=\"lastname\"> Last name: </LABEL>" | 721 " <LABEL for=\"lastname\"> Last name: </LABEL>" |
630 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" | 722 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" |
631 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | 723 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" |
632 "</FORM>"); | 724 "</FORM>", |
633 | 725 &form); |
634 WebFrame* web_frame = GetMainFrame(); | 726 ExpectDefaultForm(form); |
635 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
636 | |
637 FormManager form_manager; | |
638 form_manager.ExtractForms(web_frame); | |
639 | |
640 std::vector<FormData> forms; | |
641 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
642 ASSERT_EQ(1U, forms.size()); | |
643 | |
644 const FormData& form = forms[0]; | |
645 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
646 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
647 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
648 | 727 |
649 const std::vector<FormField>& fields = form.fields; | 728 const std::vector<FormField>& fields = form.fields; |
650 ASSERT_EQ(3U, fields.size()); | 729 ASSERT_EQ(3U, fields.size()); |
651 EXPECT_TRUE(fields[0].StrictlyEqualsHack( | 730 EXPECT_TRUE(fields[0].StrictlyEqualsHack( |
652 FormField(ASCIIToUTF16("First name:"), | 731 FormField(ASCIIToUTF16("First name:"), |
653 ASCIIToUTF16("firstname"), | 732 ASCIIToUTF16("firstname"), |
654 ASCIIToUTF16("John"), | 733 ASCIIToUTF16("John"), |
655 ASCIIToUTF16("text"), | 734 ASCIIToUTF16("text"), |
656 20))); | 735 20))); |
657 EXPECT_TRUE(fields[1].StrictlyEqualsHack( | 736 EXPECT_TRUE(fields[1].StrictlyEqualsHack( |
658 FormField(ASCIIToUTF16("Last name:"), | 737 FormField(ASCIIToUTF16("Last name:"), |
659 ASCIIToUTF16("lastname"), | 738 ASCIIToUTF16("lastname"), |
660 ASCIIToUTF16("Smith"), | 739 ASCIIToUTF16("Smith"), |
661 ASCIIToUTF16("text"), | 740 ASCIIToUTF16("text"), |
662 20))); | 741 20))); |
663 EXPECT_TRUE(fields[2].StrictlyEqualsHack( | 742 EXPECT_TRUE(fields[2].StrictlyEqualsHack( |
664 FormField(string16(), | 743 FormField(string16(), |
665 ASCIIToUTF16("reply-send"), | 744 ASCIIToUTF16("reply-send"), |
666 string16(), | 745 string16(), |
667 ASCIIToUTF16("submit"), | 746 ASCIIToUTF16("submit"), |
668 0))); | 747 0))); |
669 } | 748 } |
670 | 749 |
671 TEST_F(FormManagerTest, LabelsWithSpans) { | 750 TEST_F(FormManagerTest, LabelsWithSpans) { |
672 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | 751 FormData form; |
| 752 LoadForm("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" |
673 " <LABEL for=\"firstname\"><span>First name: </span></LABEL>" | 753 " <LABEL for=\"firstname\"><span>First name: </span></LABEL>" |
674 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" | 754 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" |
675 " <LABEL for=\"lastname\"><span>Last name: </span></LABEL>" | 755 " <LABEL for=\"lastname\"><span>Last name: </span></LABEL>" |
676 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" | 756 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" |
677 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | 757 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" |
678 "</FORM>"); | 758 "</FORM>", |
679 | 759 &form); |
680 WebFrame* web_frame = GetMainFrame(); | 760 ExpectDefaultForm(form); |
681 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
682 | |
683 FormManager form_manager; | |
684 form_manager.ExtractForms(web_frame); | |
685 | |
686 std::vector<FormData> forms; | |
687 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
688 ASSERT_EQ(1U, forms.size()); | |
689 | |
690 const FormData& form = forms[0]; | |
691 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
692 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
693 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
694 | 761 |
695 const std::vector<FormField>& fields = form.fields; | 762 const std::vector<FormField>& fields = form.fields; |
696 ASSERT_EQ(3U, fields.size()); | 763 ASSERT_EQ(3U, fields.size()); |
697 EXPECT_TRUE(fields[0].StrictlyEqualsHack( | 764 EXPECT_TRUE(fields[0].StrictlyEqualsHack( |
698 FormField(ASCIIToUTF16("First name:"), | 765 FormField(ASCIIToUTF16("First name:"), |
699 ASCIIToUTF16("firstname"), | 766 ASCIIToUTF16("firstname"), |
700 ASCIIToUTF16("John"), | 767 ASCIIToUTF16("John"), |
701 ASCIIToUTF16("text"), | 768 ASCIIToUTF16("text"), |
702 20))); | 769 20))); |
703 EXPECT_TRUE(fields[1].StrictlyEqualsHack( | 770 EXPECT_TRUE(fields[1].StrictlyEqualsHack( |
704 FormField(ASCIIToUTF16("Last name:"), | 771 FormField(ASCIIToUTF16("Last name:"), |
705 ASCIIToUTF16("lastname"), | 772 ASCIIToUTF16("lastname"), |
706 ASCIIToUTF16("Smith"), | 773 ASCIIToUTF16("Smith"), |
707 ASCIIToUTF16("text"), | 774 ASCIIToUTF16("text"), |
708 20))); | 775 20))); |
709 EXPECT_TRUE(fields[2].StrictlyEqualsHack( | 776 EXPECT_TRUE(fields[2].StrictlyEqualsHack( |
710 FormField(string16(), | 777 FormField(string16(), |
711 ASCIIToUTF16("reply-send"), | 778 ASCIIToUTF16("reply-send"), |
712 string16(), | 779 string16(), |
713 ASCIIToUTF16("submit"), | 780 ASCIIToUTF16("submit"), |
714 0))); | 781 0))); |
715 } | 782 } |
716 | 783 |
717 // This test is different from FormManagerTest.Labels in that the label elements | 784 // This test is different from FormManagerTest.Labels in that the label elements |
718 // for= attribute is set to the name of the form control element it is a label | 785 // for= attribute is set to the name of the form control element it is a label |
719 // for instead of the id of the form control element. This is invalid because | 786 // for instead of the id of the form control element. This is invalid because |
720 // the for= attribute must be set to the id of the form control element. | 787 // the for= attribute must be set to the id of the form control element. |
721 TEST_F(FormManagerTest, InvalidLabels) { | 788 TEST_F(FormManagerTest, InvalidLabels) { |
722 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | 789 FormData form; |
| 790 LoadForm("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" |
723 " <LABEL for=\"firstname\"> First name: </LABEL>" | 791 " <LABEL for=\"firstname\"> First name: </LABEL>" |
724 " <INPUT type=\"text\" name=\"firstname\" value=\"John\"/>" | 792 " <INPUT type=\"text\" name=\"firstname\" value=\"John\"/>" |
725 " <LABEL for=\"lastname\"> Last name: </LABEL>" | 793 " <LABEL for=\"lastname\"> Last name: </LABEL>" |
726 " <INPUT type=\"text\" name=\"lastname\" value=\"Smith\"/>" | 794 " <INPUT type=\"text\" name=\"lastname\" value=\"Smith\"/>" |
727 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | 795 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" |
728 "</FORM>"); | 796 "</FORM>", |
729 | 797 &form); |
730 WebFrame* web_frame = GetMainFrame(); | 798 ExpectDefaultForm(form); |
731 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
732 | |
733 FormManager form_manager; | |
734 form_manager.ExtractForms(web_frame); | |
735 | |
736 std::vector<FormData> forms; | |
737 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
738 ASSERT_EQ(1U, forms.size()); | |
739 | |
740 const FormData& form = forms[0]; | |
741 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
742 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
743 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
744 | 799 |
745 const std::vector<FormField>& fields = form.fields; | 800 const std::vector<FormField>& fields = form.fields; |
746 ASSERT_EQ(3U, fields.size()); | 801 ASSERT_EQ(3U, fields.size()); |
747 EXPECT_TRUE(fields[0].StrictlyEqualsHack(FormField(string16(), | 802 EXPECT_TRUE(fields[0].StrictlyEqualsHack(FormField(string16(), |
748 ASCIIToUTF16("firstname"), | 803 ASCIIToUTF16("firstname"), |
749 ASCIIToUTF16("John"), | 804 ASCIIToUTF16("John"), |
750 ASCIIToUTF16("text"), | 805 ASCIIToUTF16("text"), |
751 20))); | 806 20))); |
752 EXPECT_TRUE(fields[1].StrictlyEqualsHack(FormField(string16(), | 807 EXPECT_TRUE(fields[1].StrictlyEqualsHack(FormField(string16(), |
753 ASCIIToUTF16("lastname"), | 808 ASCIIToUTF16("lastname"), |
(...skipping 25 matching lines...) Expand all Loading... |
779 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | 834 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); |
780 | 835 |
781 FormManager form_manager; | 836 FormManager form_manager; |
782 form_manager.ExtractForms(web_frame); | 837 form_manager.ExtractForms(web_frame); |
783 | 838 |
784 std::vector<FormData> forms; | 839 std::vector<FormData> forms; |
785 form_manager.GetForms(FormManager::REQUIRE_AUTOCOMPLETE, &forms); | 840 form_manager.GetForms(FormManager::REQUIRE_AUTOCOMPLETE, &forms); |
786 ASSERT_EQ(1U, forms.size()); | 841 ASSERT_EQ(1U, forms.size()); |
787 | 842 |
788 const FormData& form = forms[0]; | 843 const FormData& form = forms[0]; |
789 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
790 EXPECT_EQ(GURL(web_frame->url()), form.origin); | 844 EXPECT_EQ(GURL(web_frame->url()), form.origin); |
791 EXPECT_EQ(GURL("http://cnn.com"), form.action); | 845 ExpectDefaultForm(form); |
792 | 846 |
793 const std::vector<FormField>& fields = form.fields; | 847 const std::vector<FormField>& fields = form.fields; |
794 ASSERT_EQ(3U, fields.size()); | 848 ASSERT_EQ(3U, fields.size()); |
795 EXPECT_EQ(FormField(ASCIIToUTF16("Middle name:"), | 849 EXPECT_EQ(FormField(ASCIIToUTF16("Middle name:"), |
796 ASCIIToUTF16("middlename"), | 850 ASCIIToUTF16("middlename"), |
797 string16(), | 851 string16(), |
798 ASCIIToUTF16("text"), | 852 ASCIIToUTF16("text"), |
799 20), | 853 20), |
800 fields[0]); | 854 fields[0]); |
801 EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"), | 855 EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"), |
802 ASCIIToUTF16("lastname"), | 856 ASCIIToUTF16("lastname"), |
803 string16(), | 857 string16(), |
804 ASCIIToUTF16("text"), | 858 ASCIIToUTF16("text"), |
805 20), | 859 20), |
806 fields[1]); | 860 fields[1]); |
807 EXPECT_EQ(FormField(string16(), | 861 EXPECT_EQ(FormField(string16(), |
808 ASCIIToUTF16("reply-send"), | 862 ASCIIToUTF16("reply-send"), |
809 ASCIIToUTF16("Send"), | 863 ASCIIToUTF16("Send"), |
810 ASCIIToUTF16("submit"), | 864 ASCIIToUTF16("submit"), |
811 0), | 865 0), |
812 fields[2]); | 866 fields[2]); |
813 } | 867 } |
814 | 868 |
815 TEST_F(FormManagerTest, LabelsInferredFromText) { | 869 TEST_F(FormManagerTest, LabelsInferredFromText) { |
816 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | 870 FormData form; |
| 871 LoadForm("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" |
817 " First name:" | 872 " First name:" |
818 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" | 873 " <INPUT type=\"text\" id=\"firstname\" value=\"John\"/>" |
819 " Last name:" | 874 " Last name:" |
820 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" | 875 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" |
821 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | 876 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" |
822 "</FORM>"); | 877 "</FORM>", |
823 | 878 &form); |
824 WebFrame* web_frame = GetMainFrame(); | 879 ExpectDefaultForm(form); |
825 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
826 | |
827 FormManager form_manager; | |
828 form_manager.ExtractForms(web_frame); | |
829 | |
830 std::vector<FormData> forms; | |
831 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
832 ASSERT_EQ(1U, forms.size()); | |
833 | |
834 const FormData& form = forms[0]; | |
835 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
836 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
837 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
838 | 880 |
839 const std::vector<FormField>& fields = form.fields; | 881 const std::vector<FormField>& fields = form.fields; |
840 ASSERT_EQ(3U, fields.size()); | 882 ASSERT_EQ(3U, fields.size()); |
841 EXPECT_EQ(FormField(ASCIIToUTF16("First name:"), | 883 EXPECT_EQ(FormField(ASCIIToUTF16("First name:"), |
842 ASCIIToUTF16("firstname"), | 884 ASCIIToUTF16("firstname"), |
843 ASCIIToUTF16("John"), | 885 ASCIIToUTF16("John"), |
844 ASCIIToUTF16("text"), | 886 ASCIIToUTF16("text"), |
845 20), | 887 20), |
846 fields[0]); | 888 fields[0]); |
847 EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"), | 889 EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"), |
848 ASCIIToUTF16("lastname"), | 890 ASCIIToUTF16("lastname"), |
849 ASCIIToUTF16("Smith"), | 891 ASCIIToUTF16("Smith"), |
850 ASCIIToUTF16("text"), | 892 ASCIIToUTF16("text"), |
851 20), | 893 20), |
852 fields[1]); | 894 fields[1]); |
853 EXPECT_EQ(FormField(string16(), | 895 EXPECT_EQ(FormField(string16(), |
854 ASCIIToUTF16("reply-send"), | 896 ASCIIToUTF16("reply-send"), |
855 ASCIIToUTF16("Send"), | 897 ASCIIToUTF16("Send"), |
856 ASCIIToUTF16("submit"), | 898 ASCIIToUTF16("submit"), |
857 0), | 899 0), |
858 fields[2]); | 900 fields[2]); |
859 } | 901 } |
860 | 902 |
861 TEST_F(FormManagerTest, LabelsInferredFromTextHidden) { | 903 TEST_F(FormManagerTest, LabelsInferredFromTextHidden) { |
862 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | 904 FormData form; |
| 905 LoadForm("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" |
863 " First name:" | 906 " First name:" |
864 " <INPUT type=\"hidden\" id=\"firstname\" value=\"John\"/>" | 907 " <INPUT type=\"hidden\" id=\"firstname\" value=\"John\"/>" |
865 " Last name:" | 908 " Last name:" |
866 " <INPUT type=\"hidden\" id=\"lastname\" value=\"Smith\"/>" | 909 " <INPUT type=\"hidden\" id=\"lastname\" value=\"Smith\"/>" |
867 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | 910 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" |
868 "</FORM>"); | 911 "</FORM>", |
869 | 912 &form); |
870 WebFrame* web_frame = GetMainFrame(); | 913 ExpectDefaultForm(form); |
871 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
872 | |
873 FormManager form_manager; | |
874 form_manager.ExtractForms(web_frame); | |
875 | |
876 std::vector<FormData> forms; | |
877 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
878 ASSERT_EQ(1U, forms.size()); | |
879 | |
880 const FormData& form = forms[0]; | |
881 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
882 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
883 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
884 | 914 |
885 const std::vector<FormField>& fields = form.fields; | 915 const std::vector<FormField>& fields = form.fields; |
886 ASSERT_EQ(3U, fields.size()); | 916 ASSERT_EQ(3U, fields.size()); |
887 EXPECT_TRUE(fields[0].StrictlyEqualsHack(FormField(string16(), | 917 EXPECT_TRUE(fields[0].StrictlyEqualsHack(FormField(string16(), |
888 ASCIIToUTF16("firstname"), | 918 ASCIIToUTF16("firstname"), |
889 ASCIIToUTF16("John"), | 919 ASCIIToUTF16("John"), |
890 ASCIIToUTF16("hidden"), | 920 ASCIIToUTF16("hidden"), |
891 0))); | 921 0))); |
892 EXPECT_TRUE(fields[1].StrictlyEqualsHack(FormField(string16(), | 922 EXPECT_TRUE(fields[1].StrictlyEqualsHack(FormField(string16(), |
893 ASCIIToUTF16("lastname"), | 923 ASCIIToUTF16("lastname"), |
894 ASCIIToUTF16("Smith"), | 924 ASCIIToUTF16("Smith"), |
895 ASCIIToUTF16("hidden"), | 925 ASCIIToUTF16("hidden"), |
896 0))); | 926 0))); |
897 EXPECT_TRUE(fields[2].StrictlyEqualsHack(FormField(string16(), | 927 EXPECT_TRUE(fields[2].StrictlyEqualsHack(FormField(string16(), |
898 ASCIIToUTF16("reply-send"), | 928 ASCIIToUTF16("reply-send"), |
899 string16(), | 929 string16(), |
900 ASCIIToUTF16("submit"), | 930 ASCIIToUTF16("submit"), |
901 0))); | 931 0))); |
902 } | 932 } |
903 | 933 |
904 TEST_F(FormManagerTest, LabelsInferredFromParagraph) { | 934 TEST_F(FormManagerTest, LabelsInferredFromParagraph) { |
905 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | 935 FormData form; |
| 936 LoadForm("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" |
906 " <P>First name:</P><INPUT type=\"text\" " | 937 " <P>First name:</P><INPUT type=\"text\" " |
907 " id=\"firstname\" value=\"John\"/>" | 938 " id=\"firstname\" value=\"John\"/>" |
908 " <P>Last name:</P>" | 939 " <P>Last name:</P>" |
909 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" | 940 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" |
910 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | 941 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" |
911 "</FORM>"); | 942 "</FORM>", |
912 | 943 &form); |
913 WebFrame* web_frame = GetMainFrame(); | 944 ExpectDefaultForm(form); |
914 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
915 | |
916 FormManager form_manager; | |
917 form_manager.ExtractForms(web_frame); | |
918 | |
919 std::vector<FormData> forms; | |
920 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
921 ASSERT_EQ(1U, forms.size()); | |
922 | |
923 const FormData& form = forms[0]; | |
924 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
925 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
926 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
927 | 945 |
928 const std::vector<FormField>& fields = form.fields; | 946 const std::vector<FormField>& fields = form.fields; |
929 ASSERT_EQ(3U, fields.size()); | 947 ASSERT_EQ(3U, fields.size()); |
930 EXPECT_EQ(FormField(ASCIIToUTF16("First name:"), | 948 EXPECT_EQ(FormField(ASCIIToUTF16("First name:"), |
931 ASCIIToUTF16("firstname"), | 949 ASCIIToUTF16("firstname"), |
932 ASCIIToUTF16("John"), | 950 ASCIIToUTF16("John"), |
933 ASCIIToUTF16("text"), | 951 ASCIIToUTF16("text"), |
934 20), | 952 20), |
935 fields[0]); | 953 fields[0]); |
936 EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"), | 954 EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"), |
937 ASCIIToUTF16("lastname"), | 955 ASCIIToUTF16("lastname"), |
938 ASCIIToUTF16("Smith"), | 956 ASCIIToUTF16("Smith"), |
939 ASCIIToUTF16("text"), | 957 ASCIIToUTF16("text"), |
940 20), | 958 20), |
941 fields[1]); | 959 fields[1]); |
942 EXPECT_EQ(FormField(string16(), | 960 EXPECT_EQ(FormField(string16(), |
943 ASCIIToUTF16("reply-send"), | 961 ASCIIToUTF16("reply-send"), |
944 ASCIIToUTF16("Send"), | 962 ASCIIToUTF16("Send"), |
945 ASCIIToUTF16("submit"), | 963 ASCIIToUTF16("submit"), |
946 0), | 964 0), |
947 fields[2]); | 965 fields[2]); |
948 } | 966 } |
949 | 967 |
950 TEST_F(FormManagerTest, LabelsInferredFromTableCell) { | 968 TEST_F(FormManagerTest, LabelsInferredFromTableCell) { |
951 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | 969 FormData form; |
| 970 LoadForm("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" |
952 "<TABLE>" | 971 "<TABLE>" |
953 " <TR>" | 972 " <TR>" |
954 " <TD>First name:</TD>" | 973 " <TD>First name:</TD>" |
955 " <TD><INPUT type=\"text\" id=\"firstname\" value=\"John\"/></TD>" | 974 " <TD><INPUT type=\"text\" id=\"firstname\" value=\"John\"/></TD>" |
956 " </TR>" | 975 " </TR>" |
957 " <TR>" | 976 " <TR>" |
958 " <TD>Last name:</TD>" | 977 " <TD>Last name:</TD>" |
959 " <TD><INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/></TD>" | 978 " <TD><INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/></TD>" |
960 " </TR>" | 979 " </TR>" |
961 " <TR>" | 980 " <TR>" |
962 " <TD></TD>" | 981 " <TD></TD>" |
963 " <TD>" | 982 " <TD>" |
964 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | 983 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" |
965 " </TD>" | 984 " </TD>" |
966 " </TR>" | 985 " </TR>" |
967 "</TABLE>" | 986 "</TABLE>" |
968 "</FORM>"); | 987 "</FORM>", |
969 | 988 &form); |
970 WebFrame* web_frame = GetMainFrame(); | 989 ExpectDefaultForm(form); |
971 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
972 | |
973 FormManager form_manager; | |
974 form_manager.ExtractForms(web_frame); | |
975 | |
976 std::vector<FormData> forms; | |
977 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
978 ASSERT_EQ(1U, forms.size()); | |
979 | |
980 const FormData& form = forms[0]; | |
981 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
982 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
983 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
984 | 990 |
985 const std::vector<FormField>& fields = form.fields; | 991 const std::vector<FormField>& fields = form.fields; |
986 ASSERT_EQ(3U, fields.size()); | 992 ASSERT_EQ(3U, fields.size()); |
987 EXPECT_EQ(FormField(ASCIIToUTF16("First name:"), | 993 EXPECT_EQ(FormField(ASCIIToUTF16("First name:"), |
988 ASCIIToUTF16("firstname"), | 994 ASCIIToUTF16("firstname"), |
989 ASCIIToUTF16("John"), | 995 ASCIIToUTF16("John"), |
990 ASCIIToUTF16("text"), | 996 ASCIIToUTF16("text"), |
991 20), | 997 20), |
992 fields[0]); | 998 fields[0]); |
993 EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"), | 999 EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"), |
994 ASCIIToUTF16("lastname"), | 1000 ASCIIToUTF16("lastname"), |
995 ASCIIToUTF16("Smith"), | 1001 ASCIIToUTF16("Smith"), |
996 ASCIIToUTF16("text"), | 1002 ASCIIToUTF16("text"), |
997 20), | 1003 20), |
998 fields[1]); | 1004 fields[1]); |
999 EXPECT_EQ(FormField(string16(), | 1005 EXPECT_EQ(FormField(string16(), |
1000 ASCIIToUTF16("reply-send"), | 1006 ASCIIToUTF16("reply-send"), |
1001 ASCIIToUTF16("Send"), | 1007 ASCIIToUTF16("Send"), |
1002 ASCIIToUTF16("submit"), | 1008 ASCIIToUTF16("submit"), |
1003 0), | 1009 0), |
1004 fields[2]); | 1010 fields[2]); |
1005 } | 1011 } |
1006 | 1012 |
1007 TEST_F(FormManagerTest, LabelsInferredFromTableCellNested) { | 1013 TEST_F(FormManagerTest, LabelsInferredFromTableCellNested) { |
1008 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | 1014 FormData form; |
| 1015 LoadForm("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" |
1009 "<TABLE>" | 1016 "<TABLE>" |
1010 " <TR>" | 1017 " <TR>" |
1011 " <TD>" | 1018 " <TD>" |
1012 " <FONT>" | 1019 " <FONT>" |
1013 " First name:" | 1020 " First name:" |
1014 " </FONT>" | 1021 " </FONT>" |
1015 " <FONT>" | 1022 " <FONT>" |
1016 " Bogus" | 1023 " Bogus" |
1017 " </FONT>" | 1024 " </FONT>" |
1018 " </TD>" | 1025 " </TD>" |
(...skipping 15 matching lines...) Expand all Loading... |
1034 " </FONT>" | 1041 " </FONT>" |
1035 " </TD>" | 1042 " </TD>" |
1036 " </TR>" | 1043 " </TR>" |
1037 " <TR>" | 1044 " <TR>" |
1038 " <TD></TD>" | 1045 " <TD></TD>" |
1039 " <TD>" | 1046 " <TD>" |
1040 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | 1047 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" |
1041 " </TD>" | 1048 " </TD>" |
1042 " </TR>" | 1049 " </TR>" |
1043 "</TABLE>" | 1050 "</TABLE>" |
1044 "</FORM>"); | 1051 "</FORM>", |
1045 | 1052 &form); |
1046 WebFrame* web_frame = GetMainFrame(); | 1053 ExpectDefaultForm(form); |
1047 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
1048 | |
1049 FormManager form_manager; | |
1050 form_manager.ExtractForms(web_frame); | |
1051 | |
1052 std::vector<FormData> forms; | |
1053 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
1054 ASSERT_EQ(1U, forms.size()); | |
1055 | |
1056 const FormData& form = forms[0]; | |
1057 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
1058 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
1059 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
1060 | 1054 |
1061 const std::vector<FormField>& fields = form.fields; | 1055 const std::vector<FormField>& fields = form.fields; |
1062 ASSERT_EQ(3U, fields.size()); | 1056 ASSERT_EQ(3U, fields.size()); |
1063 EXPECT_EQ(FormField(ASCIIToUTF16("First name:Bogus"), | 1057 EXPECT_EQ(FormField(ASCIIToUTF16("First name:Bogus"), |
1064 ASCIIToUTF16("firstname"), | 1058 ASCIIToUTF16("firstname"), |
1065 ASCIIToUTF16("John"), | 1059 ASCIIToUTF16("John"), |
1066 ASCIIToUTF16("text"), | 1060 ASCIIToUTF16("text"), |
1067 20), | 1061 20), |
1068 fields[0]); | 1062 fields[0]); |
1069 EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"), | 1063 EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"), |
1070 ASCIIToUTF16("lastname"), | 1064 ASCIIToUTF16("lastname"), |
1071 ASCIIToUTF16("Smith"), | 1065 ASCIIToUTF16("Smith"), |
1072 ASCIIToUTF16("text"), | 1066 ASCIIToUTF16("text"), |
1073 20), | 1067 20), |
1074 fields[1]); | 1068 fields[1]); |
1075 EXPECT_EQ(FormField(string16(), | 1069 EXPECT_EQ(FormField(string16(), |
1076 ASCIIToUTF16("reply-send"), | 1070 ASCIIToUTF16("reply-send"), |
1077 ASCIIToUTF16("Send"), | 1071 ASCIIToUTF16("Send"), |
1078 ASCIIToUTF16("submit"), | 1072 ASCIIToUTF16("submit"), |
1079 0), | 1073 0), |
1080 fields[2]); | 1074 fields[2]); |
1081 } | 1075 } |
1082 | 1076 |
1083 TEST_F(FormManagerTest, LabelsInferredFromDefinitionList) { | 1077 TEST_F(FormManagerTest, LabelsInferredFromDefinitionList) { |
1084 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | 1078 FormData form; |
| 1079 LoadForm("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" |
1085 "<DL>" | 1080 "<DL>" |
1086 " <DT>" | 1081 " <DT>" |
1087 " <SPAN>" | 1082 " <SPAN>" |
1088 " *" | 1083 " *" |
1089 " </SPAN>" | 1084 " </SPAN>" |
1090 " <SPAN>" | 1085 " <SPAN>" |
1091 " First name:" | 1086 " First name:" |
1092 " </SPAN>" | 1087 " </SPAN>" |
1093 " <SPAN>" | 1088 " <SPAN>" |
1094 " Bogus" | 1089 " Bogus" |
(...skipping 12 matching lines...) Expand all Loading... |
1107 " <DD>" | 1102 " <DD>" |
1108 " <FONT>" | 1103 " <FONT>" |
1109 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" | 1104 " <INPUT type=\"text\" id=\"lastname\" value=\"Smith\"/>" |
1110 " </FONT>" | 1105 " </FONT>" |
1111 " </DD>" | 1106 " </DD>" |
1112 " <DT></DT>" | 1107 " <DT></DT>" |
1113 " <DD>" | 1108 " <DD>" |
1114 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | 1109 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" |
1115 " </DD>" | 1110 " </DD>" |
1116 "</DL>" | 1111 "</DL>" |
1117 "</FORM>"); | 1112 "</FORM>", |
1118 | 1113 &form); |
1119 WebFrame* web_frame = GetMainFrame(); | 1114 ExpectDefaultForm(form); |
1120 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
1121 | |
1122 FormManager form_manager; | |
1123 form_manager.ExtractForms(web_frame); | |
1124 | |
1125 std::vector<FormData> forms; | |
1126 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
1127 ASSERT_EQ(1U, forms.size()); | |
1128 | |
1129 const FormData& form = forms[0]; | |
1130 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
1131 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
1132 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
1133 | 1115 |
1134 const std::vector<FormField>& fields = form.fields; | 1116 const std::vector<FormField>& fields = form.fields; |
1135 ASSERT_EQ(3U, fields.size()); | 1117 ASSERT_EQ(3U, fields.size()); |
1136 EXPECT_EQ(FormField(ASCIIToUTF16("*First name:Bogus"), | 1118 EXPECT_EQ(FormField(ASCIIToUTF16("*First name:Bogus"), |
1137 ASCIIToUTF16("firstname"), | 1119 ASCIIToUTF16("firstname"), |
1138 ASCIIToUTF16("John"), | 1120 ASCIIToUTF16("John"), |
1139 ASCIIToUTF16("text"), | 1121 ASCIIToUTF16("text"), |
1140 20), | 1122 20), |
1141 fields[0]); | 1123 fields[0]); |
1142 EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"), | 1124 EXPECT_EQ(FormField(ASCIIToUTF16("Last name:"), |
1143 ASCIIToUTF16("lastname"), | 1125 ASCIIToUTF16("lastname"), |
1144 ASCIIToUTF16("Smith"), | 1126 ASCIIToUTF16("Smith"), |
1145 ASCIIToUTF16("text"), | 1127 ASCIIToUTF16("text"), |
1146 20), | 1128 20), |
1147 fields[1]); | 1129 fields[1]); |
1148 EXPECT_EQ(FormField(string16(), | 1130 EXPECT_EQ(FormField(string16(), |
1149 ASCIIToUTF16("reply-send"), | 1131 ASCIIToUTF16("reply-send"), |
1150 ASCIIToUTF16("Send"), | 1132 ASCIIToUTF16("Send"), |
1151 ASCIIToUTF16("submit"), | 1133 ASCIIToUTF16("submit"), |
1152 0), | 1134 0), |
1153 fields[2]); | 1135 fields[2]); |
1154 } | 1136 } |
1155 | 1137 |
1156 TEST_F(FormManagerTest, LabelsInferredWithSameName) { | 1138 TEST_F(FormManagerTest, LabelsInferredWithSameName) { |
1157 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | 1139 FormData form; |
| 1140 LoadForm("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" |
1158 " Address Line 1:" | 1141 " Address Line 1:" |
1159 " <INPUT type=\"text\" name=\"Address\"/>" | 1142 " <INPUT type=\"text\" name=\"Address\"/>" |
1160 " Address Line 2:" | 1143 " Address Line 2:" |
1161 " <INPUT type=\"text\" name=\"Address\"/>" | 1144 " <INPUT type=\"text\" name=\"Address\"/>" |
1162 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | 1145 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" |
1163 "</FORM>"); | 1146 "</FORM>", |
1164 | 1147 &form); |
1165 WebFrame* web_frame = GetMainFrame(); | 1148 ExpectDefaultForm(form); |
1166 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
1167 | |
1168 FormManager form_manager; | |
1169 form_manager.ExtractForms(web_frame); | |
1170 | |
1171 std::vector<FormData> forms; | |
1172 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
1173 ASSERT_EQ(1U, forms.size()); | |
1174 | |
1175 const FormData& form = forms[0]; | |
1176 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
1177 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
1178 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
1179 | 1149 |
1180 const std::vector<FormField>& fields = form.fields; | 1150 const std::vector<FormField>& fields = form.fields; |
1181 ASSERT_EQ(3U, fields.size()); | 1151 ASSERT_EQ(3U, fields.size()); |
1182 EXPECT_EQ(FormField(ASCIIToUTF16("Address Line 1:"), | 1152 EXPECT_EQ(FormField(ASCIIToUTF16("Address Line 1:"), |
1183 ASCIIToUTF16("Address"), | 1153 ASCIIToUTF16("Address"), |
1184 string16(), | 1154 string16(), |
1185 ASCIIToUTF16("text"), | 1155 ASCIIToUTF16("text"), |
1186 20), | 1156 20), |
1187 fields[0]); | 1157 fields[0]); |
1188 EXPECT_EQ(FormField(ASCIIToUTF16("Address Line 2:"), | 1158 EXPECT_EQ(FormField(ASCIIToUTF16("Address Line 2:"), |
1189 ASCIIToUTF16("Address"), | 1159 ASCIIToUTF16("Address"), |
1190 string16(), | 1160 string16(), |
1191 ASCIIToUTF16("text"), | 1161 ASCIIToUTF16("text"), |
1192 20), | 1162 20), |
1193 fields[1]); | 1163 fields[1]); |
1194 EXPECT_EQ(FormField(string16(), | 1164 EXPECT_EQ(FormField(string16(), |
1195 ASCIIToUTF16("reply-send"), | 1165 ASCIIToUTF16("reply-send"), |
1196 ASCIIToUTF16("Send"), | 1166 ASCIIToUTF16("Send"), |
1197 ASCIIToUTF16("submit"), | 1167 ASCIIToUTF16("submit"), |
1198 0), | 1168 0), |
1199 fields[2]); | 1169 fields[2]); |
1200 } | 1170 } |
1201 | 1171 |
1202 TEST_F(FormManagerTest, LabelsInferredWithImageTags) { | 1172 TEST_F(FormManagerTest, LabelsInferredWithImageTags) { |
1203 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | 1173 FormData form; |
| 1174 LoadForm("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" |
1204 " Phone:" | 1175 " Phone:" |
1205 " <input type=\"text\" name=\"dayphone1\">" | 1176 " <input type=\"text\" name=\"dayphone1\">" |
1206 " <img/>" | 1177 " <img/>" |
1207 " -" | 1178 " -" |
1208 " <img/>" | 1179 " <img/>" |
1209 " <input type=\"text\" name=\"dayphone2\">" | 1180 " <input type=\"text\" name=\"dayphone2\">" |
1210 " <img/>" | 1181 " <img/>" |
1211 " -" | 1182 " -" |
1212 " <img/>" | 1183 " <img/>" |
1213 " <input type=\"text\" name=\"dayphone3\">" | 1184 " <input type=\"text\" name=\"dayphone3\">" |
1214 " ext.:" | 1185 " ext.:" |
1215 " <input type=\"text\" name=\"dayphone4\">" | 1186 " <input type=\"text\" name=\"dayphone4\">" |
1216 " <input type=\"text\" name=\"dummy\">" | 1187 " <input type=\"text\" name=\"dummy\">" |
1217 " <input type=\"submit\" name=\"reply-send\" value=\"Send\">" | 1188 " <input type=\"submit\" name=\"reply-send\" value=\"Send\">" |
1218 "</FORM>"); | 1189 "</FORM>", |
1219 | 1190 &form); |
1220 WebFrame* frame = GetMainFrame(); | 1191 ExpectDefaultForm(form); |
1221 ASSERT_NE(static_cast<WebFrame*>(NULL), frame); | |
1222 | |
1223 WebVector<WebFormElement> forms; | |
1224 frame->forms(forms); | |
1225 ASSERT_EQ(1U, forms.size()); | |
1226 | |
1227 FormData form; | |
1228 EXPECT_TRUE(FormManager::WebFormElementToFormData(forms[0], | |
1229 FormManager::REQUIRE_NONE, | |
1230 true, | |
1231 &form)); | |
1232 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
1233 EXPECT_EQ(GURL(frame->url()), form.origin); | |
1234 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
1235 | 1192 |
1236 const std::vector<FormField>& fields = form.fields; | 1193 const std::vector<FormField>& fields = form.fields; |
1237 ASSERT_EQ(6U, fields.size()); | 1194 ASSERT_EQ(6U, fields.size()); |
1238 EXPECT_EQ(FormField(ASCIIToUTF16("Phone:"), | 1195 EXPECT_EQ(FormField(ASCIIToUTF16("Phone:"), |
1239 ASCIIToUTF16("dayphone1"), | 1196 ASCIIToUTF16("dayphone1"), |
1240 string16(), | 1197 string16(), |
1241 ASCIIToUTF16("text"), | 1198 ASCIIToUTF16("text"), |
1242 20), | 1199 20), |
1243 fields[0]); | 1200 fields[0]); |
1244 EXPECT_EQ(FormField(ASCIIToUTF16("-"), | 1201 EXPECT_EQ(FormField(ASCIIToUTF16("-"), |
(...skipping 755 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2000 | 1957 |
2001 WebVector<WebFormElement> forms; | 1958 WebVector<WebFormElement> forms; |
2002 frame->forms(forms); | 1959 frame->forms(forms); |
2003 ASSERT_EQ(1U, forms.size()); | 1960 ASSERT_EQ(1U, forms.size()); |
2004 | 1961 |
2005 FormData form; | 1962 FormData form; |
2006 EXPECT_TRUE(FormManager::WebFormElementToFormData(forms[0], | 1963 EXPECT_TRUE(FormManager::WebFormElementToFormData(forms[0], |
2007 FormManager::REQUIRE_NONE, | 1964 FormManager::REQUIRE_NONE, |
2008 true, | 1965 true, |
2009 &form)); | 1966 &form)); |
2010 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
2011 EXPECT_EQ(GURL(frame->url()), form.origin); | 1967 EXPECT_EQ(GURL(frame->url()), form.origin); |
2012 EXPECT_EQ(GURL("http://cnn.com"), form.action); | 1968 ExpectDefaultForm(form); |
2013 | 1969 |
2014 const std::vector<FormField>& fields = form.fields; | 1970 const std::vector<FormField>& fields = form.fields; |
2015 ASSERT_EQ(5U, fields.size()); | 1971 ASSERT_EQ(5U, fields.size()); |
2016 EXPECT_EQ(FormField(ASCIIToUTF16("Phone:"), | 1972 EXPECT_EQ(FormField(ASCIIToUTF16("Phone:"), |
2017 ASCIIToUTF16("dayphone1"), | 1973 ASCIIToUTF16("dayphone1"), |
2018 string16(), | 1974 string16(), |
2019 ASCIIToUTF16("text"), | 1975 ASCIIToUTF16("text"), |
2020 20), | 1976 20), |
2021 fields[0]); | 1977 fields[0]); |
2022 EXPECT_EQ(FormField(ASCIIToUTF16("-"), | 1978 EXPECT_EQ(FormField(ASCIIToUTF16("-"), |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2067 | 2023 |
2068 WebVector<WebFormElement> forms; | 2024 WebVector<WebFormElement> forms; |
2069 frame->forms(forms); | 2025 frame->forms(forms); |
2070 ASSERT_EQ(1U, forms.size()); | 2026 ASSERT_EQ(1U, forms.size()); |
2071 | 2027 |
2072 FormData form; | 2028 FormData form; |
2073 EXPECT_TRUE(FormManager::WebFormElementToFormData(forms[0], | 2029 EXPECT_TRUE(FormManager::WebFormElementToFormData(forms[0], |
2074 FormManager::REQUIRE_NONE, | 2030 FormManager::REQUIRE_NONE, |
2075 true, | 2031 true, |
2076 &form)); | 2032 &form)); |
2077 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
2078 EXPECT_EQ(GURL(frame->url()), form.origin); | 2033 EXPECT_EQ(GURL(frame->url()), form.origin); |
2079 EXPECT_EQ(GURL("http://cnn.com"), form.action); | 2034 ExpectDefaultForm(form); |
2080 | 2035 |
2081 const std::vector<FormField>& fields = form.fields; | 2036 const std::vector<FormField>& fields = form.fields; |
2082 ASSERT_EQ(7U, fields.size()); | 2037 ASSERT_EQ(7U, fields.size()); |
2083 EXPECT_EQ(FormField(ASCIIToUTF16("Phone:"), | 2038 EXPECT_EQ(FormField(ASCIIToUTF16("Phone:"), |
2084 ASCIIToUTF16("dayphone1"), | 2039 ASCIIToUTF16("dayphone1"), |
2085 string16(), | 2040 string16(), |
2086 ASCIIToUTF16("text"), | 2041 ASCIIToUTF16("text"), |
2087 3), | 2042 3), |
2088 fields[0]); | 2043 fields[0]); |
2089 EXPECT_EQ(FormField(ASCIIToUTF16("-"), | 2044 EXPECT_EQ(FormField(ASCIIToUTF16("-"), |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2380 // Auto-filled attribute not set yet. | 2335 // Auto-filled attribute not set yet. |
2381 EXPECT_FALSE(form_manager.FormWithNodeIsAutoFilled(firstname)); | 2336 EXPECT_FALSE(form_manager.FormWithNodeIsAutoFilled(firstname)); |
2382 | 2337 |
2383 // Set the auto-filled attribute. | 2338 // Set the auto-filled attribute. |
2384 firstname.setAutofilled(true); | 2339 firstname.setAutofilled(true); |
2385 | 2340 |
2386 EXPECT_TRUE(form_manager.FormWithNodeIsAutoFilled(firstname)); | 2341 EXPECT_TRUE(form_manager.FormWithNodeIsAutoFilled(firstname)); |
2387 } | 2342 } |
2388 | 2343 |
2389 TEST_F(FormManagerTest, LabelsHiddenFields) { | 2344 TEST_F(FormManagerTest, LabelsHiddenFields) { |
2390 LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" | 2345 FormData form; |
| 2346 LoadForm("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">" |
2391 " <LABEL for=\"firstname\"> First name: </LABEL>" | 2347 " <LABEL for=\"firstname\"> First name: </LABEL>" |
2392 " <INPUT type=\"hidden\" id=\"firstname\" value=\"John\"/>" | 2348 " <INPUT type=\"hidden\" id=\"firstname\" value=\"John\"/>" |
2393 " <LABEL for=\"lastname\"> Last name: </LABEL>" | 2349 " <LABEL for=\"lastname\"> Last name: </LABEL>" |
2394 " <INPUT type=\"hidden\" id=\"lastname\" value=\"Smith\"/>" | 2350 " <INPUT type=\"hidden\" id=\"lastname\" value=\"Smith\"/>" |
2395 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" | 2351 " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" |
2396 "</FORM>"); | 2352 "</FORM>", |
2397 | 2353 &form); |
2398 WebFrame* web_frame = GetMainFrame(); | 2354 ExpectDefaultForm(form); |
2399 ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); | |
2400 | |
2401 FormManager form_manager; | |
2402 form_manager.ExtractForms(web_frame); | |
2403 | |
2404 std::vector<FormData> forms; | |
2405 form_manager.GetForms(FormManager::REQUIRE_NONE, &forms); | |
2406 ASSERT_EQ(1U, forms.size()); | |
2407 | |
2408 const FormData& form = forms[0]; | |
2409 EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); | |
2410 EXPECT_EQ(GURL(web_frame->url()), form.origin); | |
2411 EXPECT_EQ(GURL("http://cnn.com"), form.action); | |
2412 | 2355 |
2413 const std::vector<FormField>& fields = form.fields; | 2356 const std::vector<FormField>& fields = form.fields; |
2414 ASSERT_EQ(3U, fields.size()); | 2357 ASSERT_EQ(3U, fields.size()); |
2415 EXPECT_TRUE(fields[0].StrictlyEqualsHack( | 2358 EXPECT_TRUE(fields[0].StrictlyEqualsHack( |
2416 FormField(string16(), | 2359 FormField(string16(), |
2417 ASCIIToUTF16("firstname"), | 2360 ASCIIToUTF16("firstname"), |
2418 ASCIIToUTF16("John"), | 2361 ASCIIToUTF16("John"), |
2419 ASCIIToUTF16("hidden"), | 2362 ASCIIToUTF16("hidden"), |
2420 0))); | 2363 0))); |
2421 EXPECT_TRUE(fields[1].StrictlyEqualsHack( | 2364 EXPECT_TRUE(fields[1].StrictlyEqualsHack( |
(...skipping 24 matching lines...) Expand all Loading... |
2446 | 2389 |
2447 WebElement e = web_frame->document().getElementById("firstname"); | 2390 WebElement e = web_frame->document().getElementById("firstname"); |
2448 WebFormControlElement firstname = e.to<WebFormControlElement>(); | 2391 WebFormControlElement firstname = e.to<WebFormControlElement>(); |
2449 | 2392 |
2450 // Hidden form control element should not have a label set. | 2393 // Hidden form control element should not have a label set. |
2451 FormManager form_manager; | 2394 FormManager form_manager; |
2452 EXPECT_EQ(string16(), form_manager.LabelForElement(firstname)); | 2395 EXPECT_EQ(string16(), form_manager.LabelForElement(firstname)); |
2453 } | 2396 } |
2454 | 2397 |
2455 } // namespace | 2398 } // namespace |
OLD | NEW |