summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/page_click_tracker_unittest.cc
diff options
context:
space:
mode:
authorjcivelli@chromium.org <jcivelli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-05 04:38:06 +0000
committerjcivelli@chromium.org <jcivelli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-05 04:38:06 +0000
commit6a8ddba5ea1e8972c2954b138aeb14d77a548a3c (patch)
tree4c1a21857eca96cea8a8743a28209041de389699 /chrome/renderer/page_click_tracker_unittest.cc
parente333e8d07ee32668fc132a21c13cdf674443d1e9 (diff)
downloadchromium_src-6a8ddba5ea1e8972c2954b138aeb14d77a548a3c.zip
chromium_src-6a8ddba5ea1e8972c2954b138aeb14d77a548a3c.tar.gz
chromium_src-6a8ddba5ea1e8972c2954b138aeb14d77a548a3c.tar.bz2
Adding a class to track when a node in a page gets clicked.
This is going to be used by the password/form autofill to trigger the suggestion popup, as part of the effort in moving that code out of WebKit. BUG=None TEST=Run unit-tests. Review URL: http://codereview.chromium.org/3090007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@58597 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/page_click_tracker_unittest.cc')
-rw-r--r--chrome/renderer/page_click_tracker_unittest.cc120
1 files changed, 120 insertions, 0 deletions
diff --git a/chrome/renderer/page_click_tracker_unittest.cc b/chrome/renderer/page_click_tracker_unittest.cc
new file mode 100644
index 0000000..dcba0bb
--- /dev/null
+++ b/chrome/renderer/page_click_tracker_unittest.cc
@@ -0,0 +1,120 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/basictypes.h"
+
+#include "chrome/common/render_messages.h"
+#include "chrome/renderer/page_click_listener.h"
+#include "chrome/renderer/page_click_tracker.h"
+#include "chrome/test/render_view_test.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/WebKit/WebKit/chromium/public/WebDocument.h"
+#include "third_party/WebKit/WebKit/chromium/public/WebInputElement.h"
+#include "third_party/WebKit/WebKit/chromium/public/WebSize.h"
+#include "third_party/WebKit/WebKit/chromium/public/WebView.h"
+
+class TestPageClickListener : public PageClickListener {
+ public:
+ TestPageClickListener()
+ : called_(false),
+ was_focused_(false),
+ is_focused_(false),
+ notification_response_(false) {
+ }
+
+ virtual bool InputElementClicked(const WebKit::WebInputElement& element,
+ bool was_focused,
+ bool is_focused) {
+ called_ = true;
+ element_clicked_ = element;
+ was_focused_ = was_focused;
+ is_focused_ = is_focused;
+ return notification_response_;
+ }
+
+ void ClearResults() {
+ called_ = false;
+ element_clicked_.reset();
+ was_focused_ = false;
+ is_focused_ = false;
+ }
+
+ bool called_;
+ WebKit::WebInputElement element_clicked_;
+ bool was_focused_;
+ bool is_focused_;
+ bool notification_response_;
+};
+
+// Tests that PageClickTracker does notify correctly when a node is clicked.
+TEST_F(RenderViewTest, PageClickTracker) {
+ TestPageClickListener test_listener1;
+ TestPageClickListener test_listener2;
+ view_->page_click_tracker()->AddListener(&test_listener1);
+ view_->page_click_tracker()->AddListener(&test_listener2);
+
+ LoadHTML("<form>"
+ " <input type='text' id='text'></input><br>"
+ " <input type='button' id='button'></input><br>"
+ "</form>");
+ view_->webwidget()->resize(WebKit::WebSize(500, 500));
+ view_->webwidget()->setFocus(true);
+ WebKit::WebDocument document = view_->webview()->mainFrame()->document();
+ WebKit::WebElement text = document.getElementById("text");
+ ASSERT_FALSE(text.isNull());
+ WebKit::WebElement button = document.getElementById("button");
+ ASSERT_FALSE(button.isNull());
+
+ // Click the text field once.
+ EXPECT_TRUE(SimulateElementClick("text"));
+ EXPECT_TRUE(test_listener1.called_);
+ EXPECT_TRUE(test_listener2.called_);
+ EXPECT_FALSE(test_listener1.was_focused_);
+ EXPECT_FALSE(test_listener2.was_focused_);
+ EXPECT_TRUE(test_listener1.is_focused_);
+ EXPECT_TRUE(test_listener2.is_focused_);
+ EXPECT_TRUE(text == test_listener1.element_clicked_);
+ EXPECT_TRUE(text == test_listener2.element_clicked_);
+ test_listener1.ClearResults();
+ test_listener2.ClearResults();
+
+ // Click the text field again to test that was_focused_ is set correctly.
+ EXPECT_TRUE(SimulateElementClick("text"));
+ EXPECT_TRUE(test_listener1.called_);
+ EXPECT_TRUE(test_listener2.called_);
+ EXPECT_TRUE(test_listener1.was_focused_);
+ EXPECT_TRUE(test_listener2.was_focused_);
+ EXPECT_TRUE(test_listener1.is_focused_);
+ EXPECT_TRUE(test_listener2.is_focused_);
+ EXPECT_TRUE(text == test_listener1.element_clicked_);
+ EXPECT_TRUE(text == test_listener2.element_clicked_);
+ test_listener1.ClearResults();
+ test_listener2.ClearResults();
+
+ // Click the button, no notification should happen (this is not a text-input).
+ EXPECT_TRUE(SimulateElementClick("button"));
+ EXPECT_FALSE(test_listener1.called_);
+ EXPECT_FALSE(test_listener2.called_);
+
+ // Make the first listener stop the event propagation, click the text field
+ // and make sure only the first listener is notified.
+ test_listener1.notification_response_ = true;
+ EXPECT_TRUE(SimulateElementClick("text"));
+ EXPECT_TRUE(test_listener1.called_);
+ EXPECT_FALSE(test_listener2.called_);
+ test_listener1.ClearResults();
+
+ // Make sure removing a listener work.
+ view_->page_click_tracker()->RemoveListener(&test_listener1);
+ EXPECT_TRUE(SimulateElementClick("text"));
+ EXPECT_FALSE(test_listener1.called_);
+ EXPECT_TRUE(test_listener2.called_);
+ test_listener2.ClearResults();
+
+ // Make sure we don't choke when no listeners are registered.
+ view_->page_click_tracker()->RemoveListener(&test_listener2);
+ EXPECT_TRUE(SimulateElementClick("text"));
+ EXPECT_FALSE(test_listener1.called_);
+ EXPECT_FALSE(test_listener2.called_);
+}