Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / renderer / autofill / page_click_tracker_browsertest.cc
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
3 // found in the LICENSE file.
4
5 #include "base/basictypes.h"
6 #include "components/autofill/content/renderer/page_click_listener.h"
7 #include "components/autofill/content/renderer/page_click_tracker.h"
8 #include "content/public/renderer/render_view.h"
9 #include "content/public/test/render_view_test.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 #include "third_party/WebKit/public/web/WebDocument.h"
12 #include "third_party/WebKit/public/web/WebInputElement.h"
13 #include "third_party/WebKit/public/web/WebTextAreaElement.h"
14 #include "third_party/WebKit/public/web/WebView.h"
15 #include "third_party/WebKit/public/platform/WebSize.h"
16 #include "ui/events/keycodes/keyboard_codes.h"
17
18 namespace autofill {
19
20 class TestPageClickListener : public PageClickListener {
21  public:
22   TestPageClickListener()
23       : form_control_element_clicked_called_(false),
24         was_focused_(false) {}
25
26   virtual void FormControlElementClicked(
27       const blink::WebFormControlElement& element,
28       bool was_focused) OVERRIDE {
29     form_control_element_clicked_called_ = true;
30     form_control_element_clicked_ = element;
31     was_focused_ = was_focused;
32   }
33
34   void ClearResults() {
35     form_control_element_clicked_called_ = false;
36     form_control_element_clicked_.reset();
37     was_focused_ = false;
38   }
39
40   bool form_control_element_clicked_called_;
41   blink::WebFormControlElement form_control_element_clicked_;
42   bool was_focused_;
43 };
44
45 class PageClickTrackerTest : public content::RenderViewTest {
46  protected:
47   virtual void SetUp() OVERRIDE {
48     content::RenderViewTest::SetUp();
49
50     // RenderView creates PageClickTracker but it doesn't keep it around.
51     // Rather than make it do so for the test, we create a new object.
52     page_click_tracker_.reset(new PageClickTracker(view_, &test_listener_));
53
54     LoadHTML("<form>"
55              "  <input type='text' id='text_1'></input><br>"
56              "  <input type='text' id='text_2'></input><br>"
57              "  <textarea  id='textarea_1'></textarea><br>"
58              "  <textarea  id='textarea_2'></textarea><br>"
59              "  <input type='button' id='button'></input><br>"
60              "</form>");
61     GetWebWidget()->resize(blink::WebSize(500, 500));
62     GetWebWidget()->setFocus(true);
63     blink::WebDocument document = view_->GetWebView()->mainFrame()->document();
64     text_ = document.getElementById("text_1");
65     textarea_ = document.getElementById("textarea_1");
66     ASSERT_FALSE(text_.isNull());
67     ASSERT_FALSE(textarea_.isNull());
68   }
69
70   virtual void TearDown() OVERRIDE {
71     text_.reset();
72     textarea_.reset();
73     test_listener_.ClearResults();
74     page_click_tracker_.reset();
75     content::RenderViewTest::TearDown();
76   }
77
78   // Simulates a click on the given element and then waits for the stack
79   // to unwind.
80   void SendElementClick(const std::string& element_id) {
81     EXPECT_TRUE(SimulateElementClick(element_id));
82     ProcessPendingMessages();
83   }
84
85   // Send all the messages required for a complete key press.
86   void SendKeyPress(int key_code) {
87     blink::WebKeyboardEvent keyboard_event;
88     keyboard_event.windowsKeyCode = key_code;
89     keyboard_event.setKeyIdentifierFromWindowsKeyCode();
90
91     keyboard_event.type = blink::WebInputEvent::RawKeyDown;
92     SendWebKeyboardEvent(keyboard_event);
93
94     keyboard_event.type = blink::WebInputEvent::Char;
95     SendWebKeyboardEvent(keyboard_event);
96
97     keyboard_event.type = blink::WebInputEvent::KeyUp;
98     SendWebKeyboardEvent(keyboard_event);
99   }
100
101   scoped_ptr<PageClickTracker> page_click_tracker_;
102   TestPageClickListener test_listener_;
103   blink::WebElement text_;
104   blink::WebElement textarea_;
105 };
106
107 // Tests that PageClickTracker does notify correctly when an input
108 // node is clicked.
109 TEST_F(PageClickTrackerTest, PageClickTrackerInputClicked) {
110   EXPECT_NE(text_, text_.document().focusedElement());
111   // Click the text field once.
112   SendElementClick("text_1");
113   EXPECT_TRUE(test_listener_.form_control_element_clicked_called_);
114   EXPECT_FALSE(test_listener_.was_focused_);
115   EXPECT_TRUE(text_ == test_listener_.form_control_element_clicked_);
116   test_listener_.ClearResults();
117
118   // Click the text field again to test that was_focused_ is set correctly.
119   SendElementClick("text_1");
120   EXPECT_TRUE(test_listener_.form_control_element_clicked_called_);
121   EXPECT_TRUE(test_listener_.was_focused_);
122   EXPECT_TRUE(text_ == test_listener_.form_control_element_clicked_);
123   test_listener_.ClearResults();
124
125   // Click the button, no notification should happen (this is not a text-input).
126   SendElementClick("button");
127   EXPECT_FALSE(test_listener_.form_control_element_clicked_called_);
128 }
129
130 // Tests that PageClickTracker does notify correctly when a textarea
131 // node is clicked.
132 TEST_F(PageClickTrackerTest, PageClickTrackerTextAreaClicked) {
133   // Click the textarea field once.
134   SendElementClick("textarea_1");
135   EXPECT_TRUE(test_listener_.form_control_element_clicked_called_);
136   EXPECT_FALSE(test_listener_.was_focused_);
137   EXPECT_TRUE(textarea_ == test_listener_.form_control_element_clicked_);
138   test_listener_.ClearResults();
139
140   // Click the textarea field again to test that was_focused_ is set correctly.
141   SendElementClick("textarea_1");
142   EXPECT_TRUE(test_listener_.form_control_element_clicked_called_);
143   EXPECT_TRUE(test_listener_.was_focused_);
144   EXPECT_TRUE(textarea_ == test_listener_.form_control_element_clicked_);
145   test_listener_.ClearResults();
146
147   // Click the button, no notification should happen (this is not a text-input).
148   SendElementClick("button");
149   EXPECT_FALSE(test_listener_.form_control_element_clicked_called_);
150 }
151
152 }  // namespace autofill