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

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

Issue 8351009: Updating PageClickTracker to Notify listeners When Text Input Loses Focus. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Fixing included headers Created 9 years, 1 month 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 | Annotate | Revision Log
« no previous file with comments | « chrome/renderer/page_click_tracker.cc ('k') | content/test/render_view_test.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "chrome/common/render_messages.h" 6 #include "chrome/common/render_messages.h"
7 #include "chrome/renderer/page_click_listener.h" 7 #include "chrome/renderer/page_click_listener.h"
8 #include "chrome/renderer/page_click_tracker.h" 8 #include "chrome/renderer/page_click_tracker.h"
9 #include "chrome/test/base/chrome_render_view_test.h" 9 #include "chrome/test/base/chrome_render_view_test.h"
10 #include "content/public/renderer/render_view.h" 10 #include "content/public/renderer/render_view.h"
11 #include "testing/gtest/include/gtest/gtest.h" 11 #include "testing/gtest/include/gtest/gtest.h"
12 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" 12 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h"
13 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputElement.h" 13 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputElement.h"
14 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSize.h" 14 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSize.h"
15 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" 15 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
16 #include "ui/base/keycodes/keyboard_codes.h"
16 17
17 class TestPageClickListener : public PageClickListener { 18 class TestPageClickListener : public PageClickListener {
18 public: 19 public:
19 TestPageClickListener() 20 TestPageClickListener()
20 : called_(false), 21 : input_element_clicked_called_(false),
22 input_element_lost_focus_called_(false),
21 was_focused_(false), 23 was_focused_(false),
22 is_focused_(false), 24 is_focused_(false),
23 notification_response_(false) { 25 notification_response_(false) {
24 } 26 }
25 27
26 virtual bool InputElementClicked(const WebKit::WebInputElement& element, 28 virtual bool InputElementClicked(const WebKit::WebInputElement& element,
27 bool was_focused, 29 bool was_focused,
28 bool is_focused) { 30 bool is_focused) {
29 called_ = true; 31 input_element_clicked_called_ = true;
30 element_clicked_ = element; 32 element_clicked_ = element;
31 was_focused_ = was_focused; 33 was_focused_ = was_focused;
32 is_focused_ = is_focused; 34 is_focused_ = is_focused;
33 return notification_response_; 35 return notification_response_;
34 } 36 }
35 37
38 virtual bool InputElementLostFocus() {
39 input_element_lost_focus_called_ = true;
40 return notification_response_;
41 }
42
36 void ClearResults() { 43 void ClearResults() {
37 called_ = false; 44 input_element_clicked_called_ = false;
45 input_element_lost_focus_called_ = false;
38 element_clicked_.reset(); 46 element_clicked_.reset();
39 was_focused_ = false; 47 was_focused_ = false;
40 is_focused_ = false; 48 is_focused_ = false;
41 } 49 }
42 50
43 bool called_; 51 bool input_element_clicked_called_;
52 bool input_element_lost_focus_called_;
44 WebKit::WebInputElement element_clicked_; 53 WebKit::WebInputElement element_clicked_;
45 bool was_focused_; 54 bool was_focused_;
46 bool is_focused_; 55 bool is_focused_;
47 bool notification_response_; 56 bool notification_response_;
48 }; 57 };
49 58
59 class PageClickTrackerTest : public ChromeRenderViewTest {
60 protected:
61 virtual void SetUp() {
62 ChromeRenderViewTest::SetUp();
63
64 // RenderView creates PageClickTracker but it doesn't keep it around.
65 // Rather than make it do so for the test, we create a new object.
66 page_click_tracker_.reset(new PageClickTracker(view_));
67 page_click_tracker_->AddListener(&test_listener1_);
68 page_click_tracker_->AddListener(&test_listener2_);
69
70 LoadHTML("<form>"
71 " <input type='text' id='text_1'></input><br>"
72 " <input type='text' id='text_2'></input><br>"
73 " <input type='button' id='button'></input><br>"
74 "</form>");
75 GetWebWidget()->resize(WebKit::WebSize(500, 500));
76 GetWebWidget()->setFocus(true);
77 WebKit::WebDocument document = view_->GetWebView()->mainFrame()->document();
78 text_ = document.getElementById("text_1");
79 ASSERT_FALSE(text_.isNull());
80 }
81
82 // Send all the messages required for a complete key press.
83 void SendKeyPress(int key_code) {
84 WebKit::WebKeyboardEvent keyboard_event;
85 keyboard_event.windowsKeyCode = key_code;
86 keyboard_event.setKeyIdentifierFromWindowsKeyCode();
87
88 keyboard_event.type = WebKit::WebInputEvent::RawKeyDown;
89 SendWebKeyboardEvent(keyboard_event);
90
91 keyboard_event.type = WebKit::WebInputEvent::Char;
92 SendWebKeyboardEvent(keyboard_event);
93
94 keyboard_event.type = WebKit::WebInputEvent::KeyUp;
95 SendWebKeyboardEvent(keyboard_event);
96 }
97
98 scoped_ptr<PageClickTracker> page_click_tracker_;
99 TestPageClickListener test_listener1_;
100 TestPageClickListener test_listener2_;
101 WebKit::WebElement text_;
102 };
103
50 // Tests that PageClickTracker does notify correctly when a node is clicked. 104 // Tests that PageClickTracker does notify correctly when a node is clicked.
51 TEST_F(ChromeRenderViewTest, PageClickTracker) { 105 TEST_F(PageClickTrackerTest, PageClickTrackerInputClicked) {
52 // RenderView creates PageClickTracker but it doesn't keep it around. Rather
53 // than make it do so for the test, we create a new object.
54 PageClickTracker* page_click_tracker = new PageClickTracker(view_);
55
56 TestPageClickListener test_listener1;
57 TestPageClickListener test_listener2;
58 page_click_tracker->AddListener(&test_listener1);
59 page_click_tracker->AddListener(&test_listener2);
60
61 LoadHTML("<form>"
62 " <input type='text' id='text'></input><br>"
63 " <input type='button' id='button'></input><br>"
64 "</form>");
65 GetWebWidget()->resize(WebKit::WebSize(500, 500));
66 GetWebWidget()->setFocus(true);
67 WebKit::WebDocument document = view_->GetWebView()->mainFrame()->document();
68 WebKit::WebElement text = document.getElementById("text");
69 ASSERT_FALSE(text.isNull());
70 WebKit::WebElement button = document.getElementById("button");
71 ASSERT_FALSE(button.isNull());
72
73 // Click the text field once. 106 // Click the text field once.
74 EXPECT_TRUE(SimulateElementClick("text")); 107 EXPECT_TRUE(SimulateElementClick("text_1"));
75 EXPECT_TRUE(test_listener1.called_); 108 EXPECT_TRUE(test_listener1_.input_element_clicked_called_);
76 EXPECT_TRUE(test_listener2.called_); 109 EXPECT_TRUE(test_listener2_.input_element_clicked_called_);
77 EXPECT_FALSE(test_listener1.was_focused_); 110 EXPECT_FALSE(test_listener1_.was_focused_);
78 EXPECT_FALSE(test_listener2.was_focused_); 111 EXPECT_FALSE(test_listener2_.was_focused_);
79 EXPECT_TRUE(test_listener1.is_focused_); 112 EXPECT_TRUE(test_listener1_.is_focused_);
80 EXPECT_TRUE(test_listener2.is_focused_); 113 EXPECT_TRUE(test_listener2_.is_focused_);
81 EXPECT_TRUE(text == test_listener1.element_clicked_); 114 EXPECT_TRUE(text_ == test_listener1_.element_clicked_);
82 EXPECT_TRUE(text == test_listener2.element_clicked_); 115 EXPECT_TRUE(text_ == test_listener2_.element_clicked_);
83 test_listener1.ClearResults(); 116 test_listener1_.ClearResults();
84 test_listener2.ClearResults(); 117 test_listener2_.ClearResults();
85 118
86 // Click the text field again to test that was_focused_ is set correctly. 119 // Click the text field again to test that was_focused_ is set correctly.
87 EXPECT_TRUE(SimulateElementClick("text")); 120 EXPECT_TRUE(SimulateElementClick("text_1"));
88 EXPECT_TRUE(test_listener1.called_); 121 EXPECT_TRUE(test_listener1_.input_element_clicked_called_);
89 EXPECT_TRUE(test_listener2.called_); 122 EXPECT_TRUE(test_listener2_.input_element_clicked_called_);
90 EXPECT_TRUE(test_listener1.was_focused_); 123 EXPECT_TRUE(test_listener1_.was_focused_);
91 EXPECT_TRUE(test_listener2.was_focused_); 124 EXPECT_TRUE(test_listener2_.was_focused_);
92 EXPECT_TRUE(test_listener1.is_focused_); 125 EXPECT_TRUE(test_listener1_.is_focused_);
93 EXPECT_TRUE(test_listener2.is_focused_); 126 EXPECT_TRUE(test_listener2_.is_focused_);
94 EXPECT_TRUE(text == test_listener1.element_clicked_); 127 EXPECT_TRUE(text_ == test_listener1_.element_clicked_);
95 EXPECT_TRUE(text == test_listener2.element_clicked_); 128 EXPECT_TRUE(text_ == test_listener2_.element_clicked_);
96 test_listener1.ClearResults(); 129 test_listener1_.ClearResults();
97 test_listener2.ClearResults(); 130 test_listener2_.ClearResults();
98 131
99 // 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).
100 EXPECT_TRUE(SimulateElementClick("button")); 133 EXPECT_TRUE(SimulateElementClick("button"));
101 EXPECT_FALSE(test_listener1.called_); 134 EXPECT_FALSE(test_listener1_.input_element_clicked_called_);
102 EXPECT_FALSE(test_listener2.called_); 135 EXPECT_FALSE(test_listener2_.input_element_clicked_called_);
103 136
104 // Make the first listener stop the event propagation, click the text field 137 // Make the first listener stop the event propagation, click the text field
105 // and make sure only the first listener is notified. 138 // and make sure only the first listener is notified.
106 test_listener1.notification_response_ = true; 139 test_listener1_.notification_response_ = true;
107 EXPECT_TRUE(SimulateElementClick("text")); 140 EXPECT_TRUE(SimulateElementClick("text_1"));
108 EXPECT_TRUE(test_listener1.called_); 141 EXPECT_TRUE(test_listener1_.input_element_clicked_called_);
109 EXPECT_FALSE(test_listener2.called_); 142 EXPECT_FALSE(test_listener2_.input_element_clicked_called_);
110 test_listener1.ClearResults(); 143 test_listener1_.ClearResults();
111 144
112 // Make sure removing a listener work. 145 // Make sure removing a listener work.
113 page_click_tracker->RemoveListener(&test_listener1); 146 page_click_tracker_->RemoveListener(&test_listener1_);
114 EXPECT_TRUE(SimulateElementClick("text")); 147 EXPECT_TRUE(SimulateElementClick("text_1"));
115 EXPECT_FALSE(test_listener1.called_); 148 EXPECT_FALSE(test_listener1_.input_element_clicked_called_);
116 EXPECT_TRUE(test_listener2.called_); 149 EXPECT_TRUE(test_listener2_.input_element_clicked_called_);
117 test_listener2.ClearResults(); 150 test_listener2_.ClearResults();
118 151
119 // Make sure we don't choke when no listeners are registered. 152 // Make sure we don't choke when no listeners are registered.
120 page_click_tracker->RemoveListener(&test_listener2); 153 page_click_tracker_->RemoveListener(&test_listener2_);
121 EXPECT_TRUE(SimulateElementClick("text")); 154 EXPECT_TRUE(SimulateElementClick("text_1"));
122 EXPECT_FALSE(test_listener1.called_); 155 EXPECT_FALSE(test_listener1_.input_element_clicked_called_);
123 EXPECT_FALSE(test_listener2.called_); 156 EXPECT_FALSE(test_listener2_.input_element_clicked_called_);
124 } 157 }
158
159 TEST_F(PageClickTrackerTest, PageClickTrackerInputFocusLost) {
160 // Gain focus on the text field by using tab.
161 EXPECT_NE(text_, text_.document().focusedNode());
162 SendKeyPress(ui::VKEY_TAB);
163 EXPECT_EQ(text_, text_.document().focusedNode());
164 EXPECT_FALSE(test_listener1_.input_element_lost_focus_called_);
165 EXPECT_FALSE(test_listener2_.input_element_lost_focus_called_);
166
167 // Click a button and ensure that the lost focus notification was sent,
168 // even though focus was gained without the mouse.
169 EXPECT_TRUE(SimulateElementClick("button"));
170 EXPECT_TRUE(test_listener1_.input_element_lost_focus_called_);
171 EXPECT_TRUE(test_listener2_.input_element_lost_focus_called_);
172 test_listener1_.ClearResults();
173 test_listener2_.ClearResults();
174
175 // Click a text field and test that no lost focus notifications are sent.
176 EXPECT_TRUE(SimulateElementClick("text_1"));
177 EXPECT_FALSE(test_listener1_.input_element_lost_focus_called_);
178 EXPECT_FALSE(test_listener2_.input_element_lost_focus_called_);
179 test_listener1_.ClearResults();
180 test_listener2_.ClearResults();
181
182 // Select another text field to test that the notifcation for the
183 // first text field losing focus is sent.
184 EXPECT_TRUE(SimulateElementClick("text_2"));
185 EXPECT_TRUE(test_listener1_.input_element_lost_focus_called_);
186 EXPECT_TRUE(test_listener2_.input_element_lost_focus_called_);
187 test_listener1_.ClearResults();
188 test_listener2_.ClearResults();
189
190 // Click the button, a notification should happen since a text field has
191 // lost focus.
192 EXPECT_TRUE(SimulateElementClick("button"));
193 EXPECT_TRUE(test_listener1_.input_element_lost_focus_called_);
194 EXPECT_TRUE(test_listener2_.input_element_lost_focus_called_);
195 test_listener1_.ClearResults();
196 test_listener2_.ClearResults();
197
198 // Click on a text field while the button has focus and ensure no lost focus
199 // notification is sent.
200 EXPECT_TRUE(SimulateElementClick("text_1"));
201 EXPECT_FALSE(test_listener1_.input_element_lost_focus_called_);
202 EXPECT_FALSE(test_listener2_.input_element_lost_focus_called_);
203
204 // Make the first listener stop the event propagation, then click a button
205 // and make sure only the first listener is notified.
206 test_listener1_.notification_response_ = true;
207 EXPECT_TRUE(SimulateElementClick("button"));
208 EXPECT_TRUE(test_listener1_.input_element_lost_focus_called_);
209 EXPECT_FALSE(test_listener2_.input_element_lost_focus_called_);
210 test_listener1_.ClearResults();
211
212 // Make sure removing a listener work.
213 page_click_tracker_->RemoveListener(&test_listener1_);
214 EXPECT_TRUE(SimulateElementClick("text_1"));
215 EXPECT_TRUE(SimulateElementClick("button"));
216 EXPECT_FALSE(test_listener1_.input_element_lost_focus_called_);
217 EXPECT_TRUE(test_listener2_.input_element_lost_focus_called_);
218 test_listener2_.ClearResults();
219
220 // Make sure we don't choke when no listeners are registered.
221 page_click_tracker_->RemoveListener(&test_listener2_);
222 EXPECT_TRUE(SimulateElementClick("text_1"));
223 EXPECT_TRUE(SimulateElementClick("button"));
224 EXPECT_FALSE(test_listener1_.input_element_lost_focus_called_);
225 EXPECT_FALSE(test_listener2_.input_element_lost_focus_called_);
226 }
OLDNEW
« no previous file with comments | « chrome/renderer/page_click_tracker.cc ('k') | content/test/render_view_test.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698