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

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: 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
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 16
17 class TestPageClickListener : public PageClickListener { 17 class TestPageClickListener : public PageClickListener {
18 public: 18 public:
19 TestPageClickListener() 19 TestPageClickListener()
20 : called_(false), 20 : input_element_clicked_called_(false),
21 input_element_lost_focus_called_(false),
21 was_focused_(false), 22 was_focused_(false),
22 is_focused_(false), 23 is_focused_(false),
23 notification_response_(false) { 24 notification_response_(false) {
24 } 25 }
25 26
26 virtual bool InputElementClicked(const WebKit::WebInputElement& element, 27 virtual bool InputElementClicked(const WebKit::WebInputElement& element,
27 bool was_focused, 28 bool was_focused,
28 bool is_focused) { 29 bool is_focused) {
29 called_ = true; 30 input_element_clicked_called_ = true;
30 element_clicked_ = element; 31 element_clicked_ = element;
31 was_focused_ = was_focused; 32 was_focused_ = was_focused;
32 is_focused_ = is_focused; 33 is_focused_ = is_focused;
33 return notification_response_; 34 return notification_response_;
34 } 35 }
35 36
37 virtual bool InputElementLostFocus() {
38 input_element_lost_focus_called_ = true;
39 return notification_response_;
40 }
41
36 void ClearResults() { 42 void ClearResults() {
37 called_ = false; 43 input_element_clicked_called_ = false;
44 input_element_lost_focus_called_ = false;
38 element_clicked_.reset(); 45 element_clicked_.reset();
39 was_focused_ = false; 46 was_focused_ = false;
40 is_focused_ = false; 47 is_focused_ = false;
41 } 48 }
42 49
43 bool called_; 50 bool input_element_clicked_called_;
51 bool input_element_lost_focus_called_;
44 WebKit::WebInputElement element_clicked_; 52 WebKit::WebInputElement element_clicked_;
45 bool was_focused_; 53 bool was_focused_;
46 bool is_focused_; 54 bool is_focused_;
47 bool notification_response_; 55 bool notification_response_;
48 }; 56 };
49 57
58 class PageClickTrackerTest : public ChromeRenderViewTest {
59 protected:
60 virtual void SetUp() {
61 ChromeRenderViewTest::SetUp();
62
63 // RenderView creates PageClickTracker but it doesn't keep it around.
64 // Rather than make it do so for the test, we create a new object.
65 page_click_tracker_ = new PageClickTracker(view_);
66
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 WebKit::WebElement button = document.getElementById("button");
81 ASSERT_FALSE(button.isNull());
Ilya Sherman 2011/10/24 21:30:46 nit: If the |button| is not used, it should be saf
82 }
83
84 PageClickTracker* page_click_tracker_;
Ilya Sherman 2011/10/24 21:30:46 This should be a scoped_ptr<PageClickTracker>, so
85 TestPageClickListener test_listener1_;
86 TestPageClickListener test_listener2_;
87 WebKit::WebElement text_;
88
89 };
90
50 // Tests that PageClickTracker does notify correctly when a node is clicked. 91 // Tests that PageClickTracker does notify correctly when a node is clicked.
51 TEST_F(ChromeRenderViewTest, PageClickTracker) { 92 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. 93 // Click the text field once.
74 EXPECT_TRUE(SimulateElementClick("text")); 94 EXPECT_TRUE(SimulateElementClick("text_1"));
75 EXPECT_TRUE(test_listener1.called_); 95 EXPECT_TRUE(test_listener1_.input_element_clicked_called_);
76 EXPECT_TRUE(test_listener2.called_); 96 EXPECT_TRUE(test_listener2_.input_element_clicked_called_);
77 EXPECT_FALSE(test_listener1.was_focused_); 97 EXPECT_FALSE(test_listener1_.was_focused_);
78 EXPECT_FALSE(test_listener2.was_focused_); 98 EXPECT_FALSE(test_listener2_.was_focused_);
79 EXPECT_TRUE(test_listener1.is_focused_); 99 EXPECT_TRUE(test_listener1_.is_focused_);
80 EXPECT_TRUE(test_listener2.is_focused_); 100 EXPECT_TRUE(test_listener2_.is_focused_);
81 EXPECT_TRUE(text == test_listener1.element_clicked_); 101 EXPECT_TRUE(text_ == test_listener1_.element_clicked_);
82 EXPECT_TRUE(text == test_listener2.element_clicked_); 102 EXPECT_TRUE(text_ == test_listener2_.element_clicked_);
83 test_listener1.ClearResults(); 103 test_listener1_.ClearResults();
84 test_listener2.ClearResults(); 104 test_listener2_.ClearResults();
85 105
86 // Click the text field again to test that was_focused_ is set correctly. 106 // Click the text field again to test that was_focused_ is set correctly.
87 EXPECT_TRUE(SimulateElementClick("text")); 107 EXPECT_TRUE(SimulateElementClick("text_1"));
88 EXPECT_TRUE(test_listener1.called_); 108 EXPECT_TRUE(test_listener1_.input_element_clicked_called_);
89 EXPECT_TRUE(test_listener2.called_); 109 EXPECT_TRUE(test_listener2_.input_element_clicked_called_);
90 EXPECT_TRUE(test_listener1.was_focused_); 110 EXPECT_TRUE(test_listener1_.was_focused_);
91 EXPECT_TRUE(test_listener2.was_focused_); 111 EXPECT_TRUE(test_listener2_.was_focused_);
92 EXPECT_TRUE(test_listener1.is_focused_); 112 EXPECT_TRUE(test_listener1_.is_focused_);
93 EXPECT_TRUE(test_listener2.is_focused_); 113 EXPECT_TRUE(test_listener2_.is_focused_);
94 EXPECT_TRUE(text == test_listener1.element_clicked_); 114 EXPECT_TRUE(text_ == test_listener1_.element_clicked_);
95 EXPECT_TRUE(text == test_listener2.element_clicked_); 115 EXPECT_TRUE(text_ == test_listener2_.element_clicked_);
96 test_listener1.ClearResults(); 116 test_listener1_.ClearResults();
97 test_listener2.ClearResults(); 117 test_listener2_.ClearResults();
98 118
99 // Click the button, no notification should happen (this is not a text-input). 119 // Click the button, no notification should happen (this is not a text-input).
100 EXPECT_TRUE(SimulateElementClick("button")); 120 EXPECT_TRUE(SimulateElementClick("button"));
101 EXPECT_FALSE(test_listener1.called_); 121 EXPECT_FALSE(test_listener1_.input_element_clicked_called_);
102 EXPECT_FALSE(test_listener2.called_); 122 EXPECT_FALSE(test_listener2_.input_element_clicked_called_);
103 123
104 // Make the first listener stop the event propagation, click the text field 124 // Make the first listener stop the event propagation, click the text field
105 // and make sure only the first listener is notified. 125 // and make sure only the first listener is notified.
106 test_listener1.notification_response_ = true; 126 test_listener1_.notification_response_ = true;
107 EXPECT_TRUE(SimulateElementClick("text")); 127 EXPECT_TRUE(SimulateElementClick("text_1"));
108 EXPECT_TRUE(test_listener1.called_); 128 EXPECT_TRUE(test_listener1_.input_element_clicked_called_);
109 EXPECT_FALSE(test_listener2.called_); 129 EXPECT_FALSE(test_listener2_.input_element_clicked_called_);
110 test_listener1.ClearResults(); 130 test_listener1_.ClearResults();
111 131
112 // Make sure removing a listener work. 132 // Make sure removing a listener work.
113 page_click_tracker->RemoveListener(&test_listener1); 133 page_click_tracker_->RemoveListener(&test_listener1_);
114 EXPECT_TRUE(SimulateElementClick("text")); 134 EXPECT_TRUE(SimulateElementClick("text_1"));
115 EXPECT_FALSE(test_listener1.called_); 135 EXPECT_FALSE(test_listener1_.input_element_clicked_called_);
116 EXPECT_TRUE(test_listener2.called_); 136 EXPECT_TRUE(test_listener2_.input_element_clicked_called_);
117 test_listener2.ClearResults(); 137 test_listener2_.ClearResults();
118 138
119 // Make sure we don't choke when no listeners are registered. 139 // Make sure we don't choke when no listeners are registered.
120 page_click_tracker->RemoveListener(&test_listener2); 140 page_click_tracker_->RemoveListener(&test_listener2_);
121 EXPECT_TRUE(SimulateElementClick("text")); 141 EXPECT_TRUE(SimulateElementClick("text_1"));
122 EXPECT_FALSE(test_listener1.called_); 142 EXPECT_FALSE(test_listener1_.input_element_clicked_called_);
123 EXPECT_FALSE(test_listener2.called_); 143 EXPECT_FALSE(test_listener2_.input_element_clicked_called_);
124 } 144 }
145
146 TEST_F(PageClickTrackerTest, PageClickTrackerInputFocusLost) {
147 // Click a text field and test the no lost focus notifications are sent.
Ilya Sherman 2011/10/24 21:30:46 nit: "the" -> "that"
148 EXPECT_TRUE(SimulateElementClick("text_1"));
149 EXPECT_FALSE(test_listener1_.input_element_lost_focus_called_);
150 EXPECT_FALSE(test_listener2_.input_element_lost_focus_called_);
151 test_listener1_.ClearResults();
152 test_listener2_.ClearResults();
153
154 // Select another text field to test that the notifcation for the
155 // first text field losing focus is sent.
156 EXPECT_TRUE(SimulateElementClick("text_2"));
157 EXPECT_TRUE(test_listener1_.input_element_lost_focus_called_);
158 EXPECT_TRUE(test_listener2_.input_element_lost_focus_called_);
159 test_listener1_.ClearResults();
160 test_listener2_.ClearResults();
161
162 // Click the button, a notification should happen since a text field has
163 // lost focus.
164 EXPECT_TRUE(SimulateElementClick("button"));
165 EXPECT_TRUE(test_listener1_.input_element_lost_focus_called_);
166 EXPECT_TRUE(test_listener2_.input_element_lost_focus_called_);
167 test_listener1_.ClearResults();
168 test_listener2_.ClearResults();
169
Ilya Sherman 2011/10/24 21:30:46 Let's add a test immediately after this that click
170 // Make the first listener stop the event propagation, click the text field,
171 // then a button and make sure only the first listener is notified.
172 test_listener1_.notification_response_ = true;
173 EXPECT_TRUE(SimulateElementClick("text_1"));
174 EXPECT_TRUE(SimulateElementClick("button"));
175 EXPECT_TRUE(test_listener1_.input_element_lost_focus_called_);
176 EXPECT_FALSE(test_listener2_.input_element_lost_focus_called_);
177 test_listener1_.ClearResults();
178
179 // Make sure removing a listener work.
180 page_click_tracker_->RemoveListener(&test_listener1_);
181 EXPECT_TRUE(SimulateElementClick("text_1"));
182 EXPECT_TRUE(SimulateElementClick("button"));
183 EXPECT_FALSE(test_listener1_.input_element_lost_focus_called_);
184 EXPECT_TRUE(test_listener2_.input_element_lost_focus_called_);
185 test_listener2_.ClearResults();
186
187 // Make sure we don't choke when no listeners are registered.
188 page_click_tracker_->RemoveListener(&test_listener2_);
189 EXPECT_TRUE(SimulateElementClick("text_1"));
190 EXPECT_TRUE(SimulateElementClick("button"));
191 EXPECT_FALSE(test_listener1_.input_element_lost_focus_called_);
192 EXPECT_FALSE(test_listener2_.input_element_lost_focus_called_);
193 }
OLDNEW
« chrome/renderer/page_click_tracker.cc ('K') | « chrome/renderer/page_click_tracker.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698