From 6a8ddba5ea1e8972c2954b138aeb14d77a548a3c Mon Sep 17 00:00:00 2001 From: "jcivelli@chromium.org" Date: Sun, 5 Sep 2010 04:38:06 +0000 Subject: 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 --- chrome/renderer/page_click_tracker_unittest.cc | 120 +++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 chrome/renderer/page_click_tracker_unittest.cc (limited to 'chrome/renderer/page_click_tracker_unittest.cc') 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("
" + "
" + "
" + "
"); + 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_); +} -- cgit v1.1