Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(143)

Side by Side Diff: chrome/renderer/autofill/page_click_tracker_browsertest.cc

Issue 140093005: Add supports that allow Autofill to be initiated from textarea field (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update code as per review comments Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/basictypes.h" 5 #include "base/basictypes.h"
6 #include "components/autofill/content/renderer/page_click_listener.h" 6 #include "components/autofill/content/renderer/page_click_listener.h"
7 #include "components/autofill/content/renderer/page_click_tracker.h" 7 #include "components/autofill/content/renderer/page_click_tracker.h"
8 #include "content/public/renderer/render_view.h" 8 #include "content/public/renderer/render_view.h"
9 #include "content/public/test/render_view_test.h" 9 #include "content/public/test/render_view_test.h"
10 #include "testing/gtest/include/gtest/gtest.h" 10 #include "testing/gtest/include/gtest/gtest.h"
11 #include "third_party/WebKit/public/web/WebDocument.h" 11 #include "third_party/WebKit/public/web/WebDocument.h"
12 #include "third_party/WebKit/public/web/WebInputElement.h" 12 #include "third_party/WebKit/public/web/WebInputElement.h"
13 #include "third_party/WebKit/public/web/WebTextAreaElement.h"
13 #include "third_party/WebKit/public/web/WebView.h" 14 #include "third_party/WebKit/public/web/WebView.h"
14 #include "third_party/WebKit/public/platform/WebSize.h" 15 #include "third_party/WebKit/public/platform/WebSize.h"
15 #include "ui/events/keycodes/keyboard_codes.h" 16 #include "ui/events/keycodes/keyboard_codes.h"
16 17
17 namespace autofill { 18 namespace autofill {
18 19
19 class TestPageClickListener : public PageClickListener { 20 class TestPageClickListener : public PageClickListener {
20 public: 21 public:
21 TestPageClickListener() 22 TestPageClickListener()
22 : input_element_clicked_called_(false), 23 : formcontrol_element_clicked_called_(false),
23 input_element_lost_focus_called_(false), 24 formcontrol_element_lost_focus_called_(false),
24 was_focused_(false), 25 was_focused_(false),
25 is_focused_(false) { 26 is_focused_(false) {
26 } 27 }
27 28
28 virtual void InputElementClicked(const blink::WebInputElement& element, 29 virtual void FormControlElementClicked(
29 bool was_focused, 30 const blink::WebFormControlElement& element,
30 bool is_focused) OVERRIDE { 31 bool was_focused,
31 input_element_clicked_called_ = true; 32 bool is_focused) OVERRIDE {
32 element_clicked_ = element; 33 formcontrol_element_clicked_called_ = true;
34 formcontrol_element_clicked_ = element;
33 was_focused_ = was_focused; 35 was_focused_ = was_focused;
34 is_focused_ = is_focused; 36 is_focused_ = is_focused;
35 } 37 }
36 38
37 virtual void InputElementLostFocus() OVERRIDE { 39 virtual void FormControlElementLostFocus() OVERRIDE {
38 input_element_lost_focus_called_ = true; 40 formcontrol_element_lost_focus_called_ = true;
39 } 41 }
40 42
41 void ClearResults() { 43 void ClearFormControlResults() {
42 input_element_clicked_called_ = false; 44 formcontrol_element_clicked_called_ = false;
43 input_element_lost_focus_called_ = false; 45 formcontrol_element_lost_focus_called_ = false;
44 element_clicked_.reset(); 46 formcontrol_element_clicked_.reset();
45 was_focused_ = false; 47 was_focused_ = false;
46 is_focused_ = false; 48 is_focused_ = false;
47 } 49 }
48 50
49 bool input_element_clicked_called_; 51 bool formcontrol_element_clicked_called_;
50 bool input_element_lost_focus_called_; 52 bool formcontrol_element_lost_focus_called_;
51 blink::WebInputElement element_clicked_; 53 blink::WebFormControlElement formcontrol_element_clicked_;
52 bool was_focused_; 54 bool was_focused_;
53 bool is_focused_; 55 bool is_focused_;
54 }; 56 };
55 57
56 class PageClickTrackerTest : public content::RenderViewTest { 58 class PageClickTrackerTest : public content::RenderViewTest {
57 protected: 59 protected:
58 virtual void SetUp() OVERRIDE { 60 virtual void SetUp() OVERRIDE {
59 content::RenderViewTest::SetUp(); 61 content::RenderViewTest::SetUp();
60 62
61 // RenderView creates PageClickTracker but it doesn't keep it around. 63 // RenderView creates PageClickTracker but it doesn't keep it around.
62 // Rather than make it do so for the test, we create a new object. 64 // Rather than make it do so for the test, we create a new object.
63 page_click_tracker_.reset(new PageClickTracker(view_, &test_listener_)); 65 page_click_tracker_.reset(new PageClickTracker(view_, &test_listener_));
64 66
65 LoadHTML("<form>" 67 LoadHTML("<form>"
66 " <input type='text' id='text_1'></input><br>" 68 " <input type='text' id='text_1'></input><br>"
67 " <input type='text' id='text_2'></input><br>" 69 " <input type='text' id='text_2'></input><br>"
70 " <textarea id='textarea_1'></textarea><br>"
71 " <textarea id='textarea_2'></textarea><br>"
68 " <input type='button' id='button'></input><br>" 72 " <input type='button' id='button'></input><br>"
69 "</form>"); 73 "</form>");
70 GetWebWidget()->resize(blink::WebSize(500, 500)); 74 GetWebWidget()->resize(blink::WebSize(500, 500));
71 GetWebWidget()->setFocus(true); 75 GetWebWidget()->setFocus(true);
72 blink::WebDocument document = view_->GetWebView()->mainFrame()->document(); 76 blink::WebDocument document = view_->GetWebView()->mainFrame()->document();
73 text_ = document.getElementById("text_1"); 77 text_ = document.getElementById("text_1");
78 textarea_ = document.getElementById("textarea_1");
74 ASSERT_FALSE(text_.isNull()); 79 ASSERT_FALSE(text_.isNull());
80 ASSERT_FALSE(textarea_.isNull());
75 } 81 }
76 82
77 virtual void TearDown() OVERRIDE { 83 virtual void TearDown() OVERRIDE {
78 text_.reset(); 84 text_.reset();
79 test_listener_.ClearResults(); 85 textarea_.reset();
86 test_listener_.ClearFormControlResults();
80 page_click_tracker_.reset(); 87 page_click_tracker_.reset();
81 content::RenderViewTest::TearDown(); 88 content::RenderViewTest::TearDown();
82 } 89 }
83 90
84 // Send all the messages required for a complete key press. 91 // Send all the messages required for a complete key press.
85 void SendKeyPress(int key_code) { 92 void SendKeyPress(int key_code) {
86 blink::WebKeyboardEvent keyboard_event; 93 blink::WebKeyboardEvent keyboard_event;
87 keyboard_event.windowsKeyCode = key_code; 94 keyboard_event.windowsKeyCode = key_code;
88 keyboard_event.setKeyIdentifierFromWindowsKeyCode(); 95 keyboard_event.setKeyIdentifierFromWindowsKeyCode();
89 96
90 keyboard_event.type = blink::WebInputEvent::RawKeyDown; 97 keyboard_event.type = blink::WebInputEvent::RawKeyDown;
91 SendWebKeyboardEvent(keyboard_event); 98 SendWebKeyboardEvent(keyboard_event);
92 99
93 keyboard_event.type = blink::WebInputEvent::Char; 100 keyboard_event.type = blink::WebInputEvent::Char;
94 SendWebKeyboardEvent(keyboard_event); 101 SendWebKeyboardEvent(keyboard_event);
95 102
96 keyboard_event.type = blink::WebInputEvent::KeyUp; 103 keyboard_event.type = blink::WebInputEvent::KeyUp;
97 SendWebKeyboardEvent(keyboard_event); 104 SendWebKeyboardEvent(keyboard_event);
98 } 105 }
99 106
100 scoped_ptr<PageClickTracker> page_click_tracker_; 107 scoped_ptr<PageClickTracker> page_click_tracker_;
101 TestPageClickListener test_listener_; 108 TestPageClickListener test_listener_;
102 blink::WebElement text_; 109 blink::WebElement text_;
110 blink::WebElement textarea_;
103 }; 111 };
104 112
105 // Tests that PageClickTracker does notify correctly when a node is clicked. 113 // Tests that PageClickTracker does notify correctly when a input
114 // node is clicked.
106 TEST_F(PageClickTrackerTest, PageClickTrackerInputClicked) { 115 TEST_F(PageClickTrackerTest, PageClickTrackerInputClicked) {
107 // Click the text field once. 116 // Click the text field once.
108 EXPECT_TRUE(SimulateElementClick("text_1")); 117 EXPECT_TRUE(SimulateElementClick("text_1"));
109 EXPECT_TRUE(test_listener_.input_element_clicked_called_); 118 EXPECT_TRUE(test_listener_.formcontrol_element_clicked_called_);
110 EXPECT_FALSE(test_listener_.was_focused_); 119 EXPECT_FALSE(test_listener_.was_focused_);
111 EXPECT_TRUE(test_listener_.is_focused_); 120 EXPECT_TRUE(test_listener_.is_focused_);
112 EXPECT_TRUE(text_ == test_listener_.element_clicked_); 121 EXPECT_TRUE(text_ == test_listener_.formcontrol_element_clicked_);
113 test_listener_.ClearResults(); 122 test_listener_.ClearFormControlResults();
114 123
115 // Click the text field again to test that was_focused_ is set correctly. 124 // Click the text field again to test that was_focused_ is set correctly.
116 EXPECT_TRUE(SimulateElementClick("text_1")); 125 EXPECT_TRUE(SimulateElementClick("text_1"));
117 EXPECT_TRUE(test_listener_.input_element_clicked_called_); 126 EXPECT_TRUE(test_listener_.formcontrol_element_clicked_called_);
118 EXPECT_TRUE(test_listener_.was_focused_); 127 EXPECT_TRUE(test_listener_.was_focused_);
119 EXPECT_TRUE(test_listener_.is_focused_); 128 EXPECT_TRUE(test_listener_.is_focused_);
120 EXPECT_TRUE(text_ == test_listener_.element_clicked_); 129 EXPECT_TRUE(text_ == test_listener_.formcontrol_element_clicked_);
121 test_listener_.ClearResults(); 130 test_listener_.ClearFormControlResults();
122 131
123 // Click the button, no notification should happen (this is not a text-input). 132 // Click the button, no notification should happen (this is not a text-input).
124 EXPECT_TRUE(SimulateElementClick("button")); 133 EXPECT_TRUE(SimulateElementClick("button"));
125 EXPECT_FALSE(test_listener_.input_element_clicked_called_); 134 EXPECT_FALSE(test_listener_.formcontrol_element_clicked_called_);
135 }
136
137 // Tests that PageClickTracker does notify correctly when a textarea
138 // node is clicked.
139 TEST_F(PageClickTrackerTest, PageClickTrackerTextAreaClicked) {
140 // Click the textarea field once.
141 EXPECT_TRUE(SimulateElementClick("textarea_1"));
142 EXPECT_TRUE(test_listener_.formcontrol_element_clicked_called_);
143 EXPECT_FALSE(test_listener_.was_focused_);
144 EXPECT_TRUE(test_listener_.is_focused_);
145 EXPECT_TRUE(textarea_ == test_listener_.formcontrol_element_clicked_);
146 test_listener_.ClearFormControlResults();
147
148 // Click the textarea field again to test that was_focused_ is set correctly.
149 EXPECT_TRUE(SimulateElementClick("textarea_1"));
150 EXPECT_TRUE(test_listener_.formcontrol_element_clicked_called_);
151 EXPECT_TRUE(test_listener_.was_focused_);
152 EXPECT_TRUE(test_listener_.is_focused_);
153 EXPECT_TRUE(textarea_ == test_listener_.formcontrol_element_clicked_);
154 test_listener_.ClearFormControlResults();
155
156 // Click the button, no notification should happen (this is not a text-input).
157 EXPECT_TRUE(SimulateElementClick("button"));
158 EXPECT_FALSE(test_listener_.formcontrol_element_clicked_called_);
126 } 159 }
127 160
128 TEST_F(PageClickTrackerTest, PageClickTrackerInputFocusLost) { 161 TEST_F(PageClickTrackerTest, PageClickTrackerInputFocusLost) {
129 // Gain focus on the text field by using tab. 162 // Gain focus on the text field by using tab.
130 EXPECT_NE(text_, text_.document().focusedNode()); 163 EXPECT_NE(text_, text_.document().focusedNode());
131 SendKeyPress(ui::VKEY_TAB); 164 SendKeyPress(ui::VKEY_TAB);
132 EXPECT_EQ(text_, text_.document().focusedNode()); 165 EXPECT_EQ(text_, text_.document().focusedNode());
133 EXPECT_FALSE(test_listener_.input_element_lost_focus_called_); 166 EXPECT_FALSE(test_listener_.formcontrol_element_lost_focus_called_);
134 167
135 // Click a button and ensure that the lost focus notification was sent, 168 // Click a button and ensure that the lost focus notification was sent,
136 // even though focus was gained without the mouse. 169 // even though focus was gained without the mouse.
137 EXPECT_TRUE(SimulateElementClick("button")); 170 EXPECT_TRUE(SimulateElementClick("button"));
138 EXPECT_TRUE(test_listener_.input_element_lost_focus_called_); 171 EXPECT_TRUE(test_listener_.formcontrol_element_lost_focus_called_);
139 test_listener_.ClearResults(); 172 test_listener_.ClearFormControlResults();
140 173
141 // Click a text field and test that no lost focus notifications are sent. 174 // Click a text field and test that no lost focus notifications are sent.
142 EXPECT_TRUE(SimulateElementClick("text_1")); 175 EXPECT_TRUE(SimulateElementClick("text_1"));
143 EXPECT_FALSE(test_listener_.input_element_lost_focus_called_); 176 EXPECT_FALSE(test_listener_.formcontrol_element_lost_focus_called_);
144 test_listener_.ClearResults(); 177 test_listener_.ClearFormControlResults();
145 178
146 // Select another text field to test that the notifcation for the 179 // Select another text field to test that the notifcation for the
147 // first text field losing focus is sent. 180 // first text field losing focus is sent.
148 EXPECT_TRUE(SimulateElementClick("text_2")); 181 EXPECT_TRUE(SimulateElementClick("text_2"));
149 EXPECT_TRUE(test_listener_.input_element_lost_focus_called_); 182 EXPECT_TRUE(test_listener_.formcontrol_element_lost_focus_called_);
150 test_listener_.ClearResults(); 183 test_listener_.ClearFormControlResults();
151 184
152 // Click the button, a notification should happen since a text field has 185 // Click the button, a notification should happen since a text field has
153 // lost focus. 186 // lost focus.
154 EXPECT_TRUE(SimulateElementClick("button")); 187 EXPECT_TRUE(SimulateElementClick("button"));
155 EXPECT_TRUE(test_listener_.input_element_lost_focus_called_); 188 EXPECT_TRUE(test_listener_.formcontrol_element_lost_focus_called_);
156 test_listener_.ClearResults(); 189 test_listener_.ClearFormControlResults();
157 190
158 // Click on a text field while the button has focus and ensure no lost focus 191 // Click on a text field while the button has focus and ensure no lost focus
159 // notification is sent. 192 // notification is sent.
160 EXPECT_TRUE(SimulateElementClick("text_1")); 193 EXPECT_TRUE(SimulateElementClick("text_1"));
161 EXPECT_FALSE(test_listener_.input_element_lost_focus_called_); 194 EXPECT_FALSE(test_listener_.formcontrol_element_lost_focus_called_);
162 } 195 }
163 196
197 TEST_F(PageClickTrackerTest, PageClickTrackerTextAreaFocusLost) {
198 // Gain focus on the textare field by using tab.
199 EXPECT_NE(textarea_, textarea_.document().focusedNode());
200 SendKeyPress(ui::VKEY_TAB);
201 SendKeyPress(ui::VKEY_TAB);
202 SendKeyPress(ui::VKEY_TAB);
203 EXPECT_EQ(textarea_, textarea_.document().focusedNode());
204 EXPECT_FALSE(test_listener_.formcontrol_element_lost_focus_called_);
205
206 // Click a button and ensure that the lost focus notification was sent,
207 // even though focus was gained without the mouse.
208 EXPECT_TRUE(SimulateElementClick("button"));
209 EXPECT_TRUE(test_listener_.formcontrol_element_lost_focus_called_);
210 test_listener_.ClearFormControlResults();
211
212 // Click a textarea field and test that no lost focus notifications are sent.
213 EXPECT_TRUE(SimulateElementClick("textarea_1"));
214 EXPECT_FALSE(test_listener_.formcontrol_element_lost_focus_called_);
215 test_listener_.ClearFormControlResults();
216
217 // Select another textarea field to test that the notifcation for the
218 // first textarea field losing focus is sent.
219 EXPECT_TRUE(SimulateElementClick("textarea_2"));
220 EXPECT_TRUE(test_listener_.formcontrol_element_lost_focus_called_);
221 test_listener_.ClearFormControlResults();
222
223 // Click the button, a notification should happen since a textarea field has
224 // lost focus.
225 EXPECT_TRUE(SimulateElementClick("button"));
226 EXPECT_TRUE(test_listener_.formcontrol_element_lost_focus_called_);
227 test_listener_.ClearFormControlResults();
228
229 // Click on a textarea field while the button has focus and ensure no lost
230 // focus notification is sent.
231 EXPECT_TRUE(SimulateElementClick("textarea_1"));
232 EXPECT_FALSE(test_listener_.formcontrol_element_lost_focus_called_);
233 }
164 } // namespace autofill 234 } // namespace autofill
235
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698