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