1197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// found in the LICENSE file.
4197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
5197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "config.h"
6197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
7c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/dom/Document.h"
8c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/dom/Element.h"
9c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/dom/Node.h"
10c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/html/HTMLElement.h"
119e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)#include "core/testing/URLTestHelpers.h"
12197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "public/platform/Platform.h"
13197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "public/platform/WebUnitTestSupport.h"
14c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "public/web/WebDocument.h"
15c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "web/WebLocalFrameImpl.h"
16197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "web/tests/FrameTestHelpers.h"
17197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
18197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include <gtest/gtest.h>
19197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
20197021e6b966cfb06891637935ef33fff06433d1Ben Murdochusing namespace blink;
21197021e6b966cfb06891637935ef33fff06433d1Ben Murdochusing blink::FrameTestHelpers::runPendingTasks;
227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciusing blink::FrameTestHelpers::loadFrame;
237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciusing URLTestHelpers::registerMockedURLFromBaseURL;
24197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
25197021e6b966cfb06891637935ef33fff06433d1Ben Murdochnamespace {
26197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
27197021e6b966cfb06891637935ef33fff06433d1Ben Murdochclass ImeRequestTrackingWebViewClient : public FrameTestHelpers::TestWebViewClient {
28197021e6b966cfb06891637935ef33fff06433d1Ben Murdochpublic:
29197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    ImeRequestTrackingWebViewClient() :
30197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        m_imeRequestCount(0)
31197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
32197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
33197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
34197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // WebWidgetClient methods
35197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    virtual void showImeIfNeeded() OVERRIDE
36197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
37197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        ++m_imeRequestCount;
38197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
39197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
40197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // Local methds
41197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    void reset()
42197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
43197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        m_imeRequestCount = 0;
44197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
45197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
46197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    int imeRequestCount()
47197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
48197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return m_imeRequestCount;
49197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
50197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
51197021e6b966cfb06891637935ef33fff06433d1Ben Murdochprivate:
52197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    int m_imeRequestCount;
53197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch};
54197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
55197021e6b966cfb06891637935ef33fff06433d1Ben Murdochclass ImeOnFocusTest : public testing::Test {
56197021e6b966cfb06891637935ef33fff06433d1Ben Murdochpublic:
57197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    ImeOnFocusTest()
58197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        : m_baseURL("http://www.test.com/")
59197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
60197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
61197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
62197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    virtual void TearDown()
63197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
64197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        Platform::current()->unitTestSupport()->unregisterAllMockedURLs();
65197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
66197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
67197021e6b966cfb06891637935ef33fff06433d1Ben Murdochprotected:
68c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    void sendGestureTap(WebView*, IntPoint);
69c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    void focus(const WTF::AtomicString& element);
707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void runImeOnFocusTest(std::string fileName, int, IntPoint tapPoint = IntPoint(-1, -1), const WTF::AtomicString& focusElement = WTF::nullAtom, std::string frame = "");
71197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
72197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    std::string m_baseURL;
73197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    FrameTestHelpers::WebViewHelper m_webViewHelper;
74c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RefPtrWillBePersistent<Document> m_document;
75197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch};
76197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
77c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void ImeOnFocusTest::sendGestureTap(WebView* webView, IntPoint clientPoint)
78197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
79197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WebGestureEvent webGestureEvent;
80197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    webGestureEvent.type = WebInputEvent::GestureTap;
81197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    webGestureEvent.x = clientPoint.x();
82197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    webGestureEvent.y = clientPoint.y();
83197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    webGestureEvent.globalX = clientPoint.x();
84197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    webGestureEvent.globalY = clientPoint.y();
85197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    webGestureEvent.data.tap.tapCount = 1;
86197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    webGestureEvent.data.tap.width = 10;
87197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    webGestureEvent.data.tap.height = 10;
88197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
89197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    webView->handleInputEvent(webGestureEvent);
90197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    FrameTestHelpers::runPendingTasks();
91197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
92197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
93c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void ImeOnFocusTest::focus(const WTF::AtomicString& element)
94c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
95c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    m_document->body()->getElementById(element)->focus();
96c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
97c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid ImeOnFocusTest::runImeOnFocusTest(std::string fileName, int expectedImeRequestCount, IntPoint tapPoint, const WTF::AtomicString& focusElement, std::string frame)
99197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
100197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    ImeRequestTrackingWebViewClient client;
1017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL), WebString::fromUTF8(fileName));
102c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    WebViewImpl* webView = m_webViewHelper.initialize(true, 0, &client);
103197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    m_webViewHelper.webView()->setPageScaleFactorLimits(1, 1);
104197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    webView->resize(WebSize(800, 1200));
1057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    loadFrame(webView->mainFrame(), m_baseURL + fileName);
106c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    m_document = m_webViewHelper.webViewImpl()->mainFrameImpl()->document().unwrap<Document>();
107197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
108c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (!focusElement.isNull())
109c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        focus(focusElement);
110197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    EXPECT_EQ(0, client.imeRequestCount());
111c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
112197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (tapPoint.x() >= 0 && tapPoint.y() >= 0)
113197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        sendGestureTap(webView, tapPoint);
114c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!frame.empty()) {
1167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL), WebString::fromUTF8(frame));
1177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        WebFrame* childFrame = webView->mainFrame()->firstChild();
1187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        loadFrame(childFrame, m_baseURL + frame);
1197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
1207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
121c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (!focusElement.isNull())
122c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        focus(focusElement);
123197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    EXPECT_EQ(expectedImeRequestCount, client.imeRequestCount());
124197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
125197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    m_webViewHelper.reset();
126197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
127197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
128197021e6b966cfb06891637935ef33fff06433d1Ben MurdochTEST_F(ImeOnFocusTest, OnLoad)
129197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
130197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    runImeOnFocusTest("ime-on-focus-on-load.html", 0);
131197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
132197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
133197021e6b966cfb06891637935ef33fff06433d1Ben MurdochTEST_F(ImeOnFocusTest, OnAutofocus)
134197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
135197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    runImeOnFocusTest("ime-on-focus-on-autofocus.html", 0);
136197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
137197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
138197021e6b966cfb06891637935ef33fff06433d1Ben MurdochTEST_F(ImeOnFocusTest, OnUserGesture)
139197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
140c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    runImeOnFocusTest("ime-on-focus-on-user-gesture.html", 1, IntPoint(50, 50));
141c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
142c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
143c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(ImeOnFocusTest, AfterFirstGesture)
144c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
145c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    runImeOnFocusTest("ime-on-focus-after-first-gesture.html", 1, IntPoint(50, 50), "input");
146c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
147c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
148c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(ImeOnFocusTest, AfterNavigationWithinPage)
149c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
150c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    runImeOnFocusTest("ime-on-focus-after-navigation-within-page.html", 1, IntPoint(50, 50), "input");
151197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
152197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
1537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciTEST_F(ImeOnFocusTest, AfterFrameLoadOnGesture)
1547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    runImeOnFocusTest("ime-on-focus-after-frame-load-on-gesture.html", 1, IntPoint(50, 50), "input", "frame.html");
1567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
158197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
159