1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/basictypes.h" 6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/renderer/page_click_listener.h" 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/renderer/page_click_tracker.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/renderer/render_view.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/test/render_view_test.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h" 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputElement.h" 13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "third_party/WebKit/public/web/WebTextAreaElement.h" 147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebSize.h" 16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill { 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TestPageClickListener : public PageClickListener { 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestPageClickListener() 23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : form_control_element_clicked_called_(false), 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) was_focused_(false) {} 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual void FormControlElementClicked( 27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const blink::WebFormControlElement& element, 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool was_focused) OVERRIDE { 29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch form_control_element_clicked_called_ = true; 30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch form_control_element_clicked_ = element; 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) was_focused_ = was_focused; 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ClearResults() { 35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch form_control_element_clicked_called_ = false; 36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch form_control_element_clicked_.reset(); 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) was_focused_ = false; 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool form_control_element_clicked_called_; 41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch blink::WebFormControlElement form_control_element_clicked_; 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool was_focused_; 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PageClickTrackerTest : public content::RenderViewTest { 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetUp() OVERRIDE { 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::RenderViewTest::SetUp(); 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // RenderView creates PageClickTracker but it doesn't keep it around. 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Rather than make it do so for the test, we create a new object. 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) page_click_tracker_.reset(new PageClickTracker(view_, &test_listener_)); 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadHTML("<form>" 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " <input type='text' id='text_1'></input><br>" 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " <input type='text' id='text_2'></input><br>" 57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch " <textarea id='textarea_1'></textarea><br>" 58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch " <textarea id='textarea_2'></textarea><br>" 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) " <input type='button' id='button'></input><br>" 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "</form>"); 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetWebWidget()->resize(blink::WebSize(500, 500)); 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetWebWidget()->setFocus(true); 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebDocument document = view_->GetWebView()->mainFrame()->document(); 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) text_ = document.getElementById("text_1"); 65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch textarea_ = document.getElementById("textarea_1"); 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(text_.isNull()); 67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ASSERT_FALSE(textarea_.isNull()); 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void TearDown() OVERRIDE { 71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) text_.reset(); 72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch textarea_.reset(); 73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) test_listener_.ClearResults(); 74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) page_click_tracker_.reset(); 75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::RenderViewTest::TearDown(); 76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Simulates a click on the given element and then waits for the stack 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // to unwind. 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void SendElementClick(const std::string& element_id) { 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(SimulateElementClick(element_id)); 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ProcessPendingMessages(); 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Send all the messages required for a complete key press. 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SendKeyPress(int key_code) { 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebKeyboardEvent keyboard_event; 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) keyboard_event.windowsKeyCode = key_code; 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) keyboard_event.setKeyIdentifierFromWindowsKeyCode(); 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) keyboard_event.type = blink::WebInputEvent::RawKeyDown; 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SendWebKeyboardEvent(keyboard_event); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) keyboard_event.type = blink::WebInputEvent::Char; 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SendWebKeyboardEvent(keyboard_event); 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) keyboard_event.type = blink::WebInputEvent::KeyUp; 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SendWebKeyboardEvent(keyboard_event); 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<PageClickTracker> page_click_tracker_; 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestPageClickListener test_listener_; 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebElement text_; 104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch blink::WebElement textarea_; 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Tests that PageClickTracker does notify correctly when an input 108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// node is clicked. 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(PageClickTrackerTest, PageClickTrackerInputClicked) { 1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_NE(text_, text_.document().focusedElement()); 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Click the text field once. 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SendElementClick("text_1"); 113effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(test_listener_.form_control_element_clicked_called_); 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(test_listener_.was_focused_); 115effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(text_ == test_listener_.form_control_element_clicked_); 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_listener_.ClearResults(); 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Click the text field again to test that was_focused_ is set correctly. 1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SendElementClick("text_1"); 120effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(test_listener_.form_control_element_clicked_called_); 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(test_listener_.was_focused_); 122effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(text_ == test_listener_.form_control_element_clicked_); 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_listener_.ClearResults(); 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Click the button, no notification should happen (this is not a text-input). 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SendElementClick("button"); 127effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_FALSE(test_listener_.form_control_element_clicked_called_); 128effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 129effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 130effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Tests that PageClickTracker does notify correctly when a textarea 131effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// node is clicked. 132effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(PageClickTrackerTest, PageClickTrackerTextAreaClicked) { 133effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Click the textarea field once. 1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SendElementClick("textarea_1"); 135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(test_listener_.form_control_element_clicked_called_); 136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_FALSE(test_listener_.was_focused_); 137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(textarea_ == test_listener_.form_control_element_clicked_); 138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch test_listener_.ClearResults(); 139effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 140effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Click the textarea field again to test that was_focused_ is set correctly. 1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SendElementClick("textarea_1"); 142effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(test_listener_.form_control_element_clicked_called_); 143effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(test_listener_.was_focused_); 144effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(textarea_ == test_listener_.form_control_element_clicked_); 145effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch test_listener_.ClearResults(); 146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 147effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Click the button, no notification should happen (this is not a text-input). 1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SendElementClick("button"); 149effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_FALSE(test_listener_.form_control_element_clicked_called_); 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace autofill 153