WebView.cpp revision 4de82d04a6a82fee6e2d924768e88af58e966982
18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright 2007, The Android Open Source Project
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  * Redistributions of source code must retain the above copyright
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  * Redistributions in binary form must reproduce the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
163298a7d84b96ade73c6b170671711a8f2792ae59Steve Block * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define LOG_TAG "webviewglue"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2820ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "config.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#include "AndroidAnimation.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "AndroidLog.h"
326d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba#include "BaseLayerAndroid.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedFrame.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedNode.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedRoot.h"
3687962ce00229855c098ba12cee8d5c015a835289Cary Clark#include "DrawExtra.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FindCanvas.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsJNI.h"
40dcbb033aafed2abc472f0d88520869a6b1f1945bLeon Scroggins#include "HTMLInputElement.h"
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IntPoint.h"
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IntRect.h"
43797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#include "LayerAndroid.h"
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Node.h"
45908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase#include "utils/Functor.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformGraphicsContext.h"
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h"
48fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott#include "ScrollableLayerAndroid.h"
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SelectText.h"
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkCanvas.h"
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkDumpCanvas.h"
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkPicture.h"
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkRect.h"
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkTime.h"
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_INSTRUMENT
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TimeCounter.h"
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
58a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "TilesManager.h"
5920ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "WebCoreJni.h"
600b84ecf50c01e0fbf7307ca7cae55ab3043c75a3Elliott Slaughter#include "WebRequestContext.h"
6120ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "WebViewCore.h"
6220ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "android_graphics.h"
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef GET_NATIVE_VIEW
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#undef GET_NATIVE_VIEW
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define GET_NATIVE_VIEW(env, obj) ((WebView*)env->GetIntField(obj, gWebViewField))
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7020ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include <JNIUtility.h>
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <JNIHelp.h>
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <jni.h>
734de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins#include <android_runtime/android_util_AssetManager.h>
7420ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include <ui/KeycodeLabels.h>
754de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins#include <utils/AssetManager.h>
76dd7ee22af4f03672fa823324323466054f19a054Iain Merrick#include <wtf/text/AtomicString.h>
7779768700a853c40c66ff0b0591957958667fdd9eSteve Block#include <wtf/text/CString.h>
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace android {
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jfieldID gWebViewField;
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//-------------------------------------
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jmethodID GetJMethod(JNIEnv* env, jclass clazz, const char name[], const char signature[])
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID m = env->GetMethodID(clazz, name, signature);
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(m, "Could not find method %s", name);
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m;
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//-------------------------------------
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This class provides JNI for making calls into native code from the UI side
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// of the multi-threaded WebView.
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass WebView
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectenum FrameCachePermission {
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DontAllowNewer,
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AllowNewer,
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AllowNewest
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10487962ce00229855c098ba12cee8d5c015a835289Cary Clarkenum DrawExtras { // keep this in sync with WebView.java
10587962ce00229855c098ba12cee8d5c015a835289Cary Clark    DrawExtrasNone = 0,
10687962ce00229855c098ba12cee8d5c015a835289Cary Clark    DrawExtrasFind = 1,
10787962ce00229855c098ba12cee8d5c015a835289Cary Clark    DrawExtrasSelection = 2,
10887962ce00229855c098ba12cee8d5c015a835289Cary Clark    DrawExtrasCursorRing = 3
10987962ce00229855c098ba12cee8d5c015a835289Cary Clark};
11087962ce00229855c098ba12cee8d5c015a835289Cary Clark
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct JavaGlue {
1123bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott    jweak       m_obj;
113ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    jmethodID   m_calcOurContentVisibleRectF;
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_overrideLoading;
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_scrollBy;
116bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins    jmethodID   m_sendMoveFocus;
11746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    jmethodID   m_sendMoveMouse;
11846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    jmethodID   m_sendMoveMouseIfLatest;
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_sendMotionUp;
12095fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins    jmethodID   m_domChangedFocus;
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_getScaledMaxXScroll;
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_getScaledMaxYScroll;
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_getVisibleRect;
12494d36f098e1c65d69568e6fb00124c542e5c7f6fLeon Scroggins    jmethodID   m_rebuildWebTextView;
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_viewInvalidate;
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_viewInvalidateRect;
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_postInvalidateDelayed;
1283deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger    jmethodID   m_inFullScreenMode;
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jfieldID    m_rectLeft;
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jfieldID    m_rectTop;
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_rectWidth;
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_rectHeight;
133ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    jfieldID    m_rectFLeft;
134ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    jfieldID    m_rectFTop;
135ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    jmethodID   m_rectFWidth;
136ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    jmethodID   m_rectFHeight;
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AutoJObject object(JNIEnv* env) {
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return getRealObject(env, m_obj);
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} m_javaGlue;
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1424de82d04a6a82fee6e2d924768e88af58e966982Leon ScrogginsWebView(JNIEnv* env, jobject javaWebView, int viewImpl, WTF::String drawableDir, AssetManager* am) :
14387962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_ring((WebViewCore*) viewImpl)
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jclass clazz = env->FindClass("android/webkit/WebView");
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project //   m_javaGlue = new JavaGlue;
1473bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott    m_javaGlue.m_obj = env->NewWeakGlobalRef(javaWebView);
14851c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins    m_javaGlue.m_scrollBy = GetJMethod(env, clazz, "setContentScrollBy", "(IIZ)Z");
149ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    m_javaGlue.m_calcOurContentVisibleRectF = GetJMethod(env, clazz, "calcOurContentVisibleRectF", "(Landroid/graphics/RectF;)V");
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_overrideLoading = GetJMethod(env, clazz, "overrideLoading", "(Ljava/lang/String;)V");
151bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins    m_javaGlue.m_sendMoveFocus = GetJMethod(env, clazz, "sendMoveFocus", "(II)V");
15246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    m_javaGlue.m_sendMoveMouse = GetJMethod(env, clazz, "sendMoveMouse", "(IIII)V");
15394f12574c74b11db011b994e462f64a112952a47Leon Scroggins    m_javaGlue.m_sendMoveMouseIfLatest = GetJMethod(env, clazz, "sendMoveMouseIfLatest", "(ZZ)V");
154ee260612d8744993644f2e0b0f1fed51423be6dbLeon Scroggins    m_javaGlue.m_sendMotionUp = GetJMethod(env, clazz, "sendMotionUp", "(IIIII)V");
15595fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins    m_javaGlue.m_domChangedFocus = GetJMethod(env, clazz, "domChangedFocus", "()V");
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_getScaledMaxXScroll = GetJMethod(env, clazz, "getScaledMaxXScroll", "()I");
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_getScaledMaxYScroll = GetJMethod(env, clazz, "getScaledMaxYScroll", "()I");
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_getVisibleRect = GetJMethod(env, clazz, "sendOurVisibleRect", "()Landroid/graphics/Rect;");
15994d36f098e1c65d69568e6fb00124c542e5c7f6fLeon Scroggins    m_javaGlue.m_rebuildWebTextView = GetJMethod(env, clazz, "rebuildWebTextView", "()V");
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_viewInvalidate = GetJMethod(env, clazz, "viewInvalidate", "()V");
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_viewInvalidateRect = GetJMethod(env, clazz, "viewInvalidate", "(IIII)V");
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_postInvalidateDelayed = GetJMethod(env, clazz,
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        "viewInvalidateDelayed", "(JIIII)V");
1643deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger    m_javaGlue.m_inFullScreenMode = GetJMethod(env, clazz, "inFullScreenMode", "()Z");
165bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(clazz);
166bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jclass rectClass = env->FindClass("android/graphics/Rect");
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(rectClass, "Could not find Rect class");
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_rectLeft = env->GetFieldID(rectClass, "left", "I");
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_rectTop = env->GetFieldID(rectClass, "top", "I");
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_rectWidth = GetJMethod(env, rectClass, "width", "()I");
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_rectHeight = GetJMethod(env, rectClass, "height", "()I");
173bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(rectClass);
174bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block
175ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    jclass rectClassF = env->FindClass("android/graphics/RectF");
176ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    LOG_ASSERT(rectClassF, "Could not find RectF class");
177ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    m_javaGlue.m_rectFLeft = env->GetFieldID(rectClassF, "left", "F");
178ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    m_javaGlue.m_rectFTop = env->GetFieldID(rectClassF, "top", "F");
179ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    m_javaGlue.m_rectFWidth = GetJMethod(env, rectClassF, "width", "()F");
180ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    m_javaGlue.m_rectFHeight = GetJMethod(env, rectClassF, "height", "()F");
181bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(rectClassF);
182bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    env->SetIntField(javaWebView, gWebViewField, (jint)this);
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewImpl = (WebViewCore*) viewImpl;
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frameCacheUI = 0;
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_navPictureUI = 0;
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_generation = 0;
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_heightCanMeasure = false;
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_lastDx = 0;
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_lastDxTime = 0;
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_ringAnimationEnd = 0;
1926d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    m_baseLayer = 0;
193908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    m_glDrawFunctor = 0;
1944de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins    if (drawableDir.isEmpty())
1954de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins        m_buttonSkin = 0;
1964de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins    else
1974de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins        m_buttonSkin = new RenderSkinButton(am, drawableDir);
198c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger#if USE(ACCELERATED_COMPOSITING)
199c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    m_glWebViewState = 0;
200c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger#endif
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project~WebView()
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_javaGlue.m_obj)
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        JNIEnv* env = JSC::Bindings::getJNIEnv();
2083bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott        env->DeleteWeakGlobalRef(m_javaGlue.m_obj);
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_javaGlue.m_obj = 0;
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
21175394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
212c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    // We must remove the m_glWebViewState prior to deleting m_baseLayer. If we
213c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    // do not remove it here, we risk having BaseTiles trying to paint using a
214c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    // deallocated base layer.
2158360bc9c9facd690e42379610cbbb368d3d705efCary Clark    stopGL();
21675394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roard#endif
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete m_frameCacheUI;
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete m_navPictureUI;
219b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger    SkSafeUnref(m_baseLayer);
220908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    delete m_glDrawFunctor;
2214de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins    delete m_buttonSkin;
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2248360bc9c9facd690e42379610cbbb368d3d705efCary Clarkvoid stopGL()
2258360bc9c9facd690e42379610cbbb368d3d705efCary Clark{
2268360bc9c9facd690e42379610cbbb368d3d705efCary Clark#if USE(ACCELERATED_COMPOSITING)
2278360bc9c9facd690e42379610cbbb368d3d705efCary Clark    delete m_glWebViewState;
2288360bc9c9facd690e42379610cbbb368d3d705efCary Clark    m_glWebViewState = 0;
2298360bc9c9facd690e42379610cbbb368d3d705efCary Clark#endif
2308360bc9c9facd690e42379610cbbb368d3d705efCary Clark}
2318360bc9c9facd690e42379610cbbb368d3d705efCary Clark
232bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike ReedWebViewCore* getWebViewCore() const {
233bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed    return m_viewImpl;
234bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed}
235bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed
236c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark// removes the cursor altogether (e.g., when going to a new page)
237c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clarkvoid clearCursor()
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedRoot* root = getFrameCache(AllowNewer);
240c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    if (!root)
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
242c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    DBG_NAV_LOG("");
24369bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins    m_viewImpl->m_hasCursorBounds = false;
244c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    root->clearCursor();
245c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    viewInvalidate();
246c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark}
247c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark
248c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark// leaves the cursor where it is, but suppresses drawing it
249c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clarkvoid hideCursor()
250c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark{
251c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    CachedRoot* root = getFrameCache(AllowNewer);
252c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    if (!root)
253c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark        return;
254c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    DBG_NAV_LOG("");
2550924a66d1664f53afd148456e5709c471ff7240aCary Clark    hideCursor(root);
2560924a66d1664f53afd148456e5709c471ff7240aCary Clark}
2570924a66d1664f53afd148456e5709c471ff7240aCary Clark
2580924a66d1664f53afd148456e5709c471ff7240aCary Clarkvoid hideCursor(CachedRoot* root)
2590924a66d1664f53afd148456e5709c471ff7240aCary Clark{
2600924a66d1664f53afd148456e5709c471ff7240aCary Clark    DBG_NAV_LOG("inner");
26169bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins    m_viewImpl->m_hasCursorBounds = false;
262c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    root->hideCursor();
263c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    viewInvalidate();
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if DUMP_NAV_CACHE
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid debugDump()
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedRoot* root = getFrameCache(DontAllowNewer);
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (root)
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        root->mDebug.print();
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Traverse our stored array of buttons that are in our picture, and update
27646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark// their subpictures according to their current state.
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Called from the UI thread.  This is the one place in the UI thread where we
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// access the buttons stored in the WebCore thread.
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// hasFocus keeps track of whether the WebView has focus && windowFocus.
28046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark// If not, we do not want to draw the button in a selected or pressed state
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid nativeRecordButtons(bool hasFocus, bool pressed, bool invalidate)
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
28346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    bool cursorIsOnButton = false;
284f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedFrame* cachedFrame;
28546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedNode* cachedCursor = 0;
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Lock the mutex, since we now share with the WebCore thread.
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewImpl->gButtonMutex.lock();
2884de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins    if (m_viewImpl->m_buttons.size() && m_buttonSkin) {
28946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        // FIXME: In a future change, we should keep track of whether the selection
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // has changed to short circuit (note that we would still need to update
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // if we received new buttons from the WebCore thread).
29246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        WebCore::Node* cursor = 0;
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CachedRoot* root = getFrameCache(DontAllowNewer);
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (root) {
295f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark            cachedCursor = root->currentCursor(&cachedFrame);
29646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark            if (cachedCursor)
29746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark                cursor = (WebCore::Node*) cachedCursor->nodePointer();
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Traverse the array, and update each button, depending on whether it
30146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        // is selected.
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Container* end = m_viewImpl->m_buttons.end();
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (Container* ptr = m_viewImpl->m_buttons.begin(); ptr != end; ptr++) {
304438cced0716e328ab5e424e35b377d2dd686f46bCary Clark            RenderSkinAndroid::State state = RenderSkinAndroid::kNormal;
30546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark            if (ptr->matches(cursor)) {
30646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark                cursorIsOnButton = true;
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // If the WebView is out of focus/window focus, set the state to
30846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark                // normal, but still keep track of the fact that the selected is a
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // button
310438cced0716e328ab5e424e35b377d2dd686f46bCary Clark                if (hasFocus) {
311438cced0716e328ab5e424e35b377d2dd686f46bCary Clark                    if (pressed || m_ring.m_isPressed)
312438cced0716e328ab5e424e35b377d2dd686f46bCary Clark                        state = RenderSkinAndroid::kPressed;
313cd8a18fcca4aaa5658aaf236b034516fccac7932Cary Clark                    else if (SkTime::GetMSecs() < m_ringAnimationEnd)
314438cced0716e328ab5e424e35b377d2dd686f46bCary Clark                        state = RenderSkinAndroid::kFocused;
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
3174de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins            ptr->updateFocusState(state, m_buttonSkin);
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewImpl->gButtonMutex.unlock();
32146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    if (invalidate && cachedCursor && cursorIsOnButton) {
322f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark        const WebCore::IntRect& b = cachedCursor->bounds(cachedFrame);
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        viewInvalidateRect(b.x(), b.y(), b.right(), b.bottom());
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3275065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark// The caller has already determined that the desired document rect corresponds
3285065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark// to the main picture, and not a layer
329afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clarkvoid scrollRectOnScreen(const IntRect& rect)
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
331afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    if (rect.isEmpty())
332afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark        return;
3335065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    SkRect visible;
3345065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    calcOurContentVisibleRect(&visible);
3357332bc6f7a4d9ccd11185104fb0aa1a0c9b84ac0Mike Reed#if USE(ACCELERATED_COMPOSITING)
3366d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    LayerAndroid* root = compositeRoot();
3376d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (root) {
3386d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        root->updateFixedLayersPositions(visible);
3396d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        root->updatePositions();
3406d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        visible = root->subtractLayers(visible);
3415065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    }
3427332bc6f7a4d9ccd11185104fb0aa1a0c9b84ac0Mike Reed#endif
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int dx = 0;
344afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    int left = rect.x();
345afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    int right = rect.right();
3465065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    if (left < visible.fLeft) {
3475065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark        dx = left - visible.fLeft;
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Only scroll right if the entire width can fit on screen.
3495065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    } else if (right > visible.fRight && right - left < visible.width()) {
3505065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark        dx = right - visible.fRight;
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int dy = 0;
353afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    int top = rect.y();
354afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    int bottom = rect.bottom();
3555065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    if (top < visible.fTop) {
3565065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark        dy = top - visible.fTop;
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Only scroll down if the entire height can fit on screen
3585065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    } else if (bottom > visible.fBottom && bottom - top < visible.height()) {
3595065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark        dy = bottom - visible.fBottom;
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
36151c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins    if ((dx|dy) == 0 || !scrollBy(dx, dy))
362afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark        return;
36351c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins    viewInvalidate();
364e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins}
365e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins
3665065a677456ac1cb630e5271e781b2aa796af7a5Cary Clarkvoid calcOurContentVisibleRect(SkRect* r)
3675065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark{
3685065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    JNIEnv* env = JSC::Bindings::getJNIEnv();
369ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    jclass rectClass = env->FindClass("android/graphics/RectF");
370ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    jmethodID init = env->GetMethodID(rectClass, "<init>", "(FFFF)V");
3715065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    jobject jRect = env->NewObject(rectClass, init, 0, 0, 0, 0);
3725065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    env->CallVoidMethod(m_javaGlue.object(env).get(),
373ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard        m_javaGlue.m_calcOurContentVisibleRectF, jRect);
374ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    r->fLeft = env->GetFloatField(jRect, m_javaGlue.m_rectFLeft);
375ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    r->fTop = env->GetFloatField(jRect, m_javaGlue.m_rectFTop);
376ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    r->fRight = r->fLeft + env->CallFloatMethod(jRect, m_javaGlue.m_rectFWidth);
377ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    r->fBottom = r->fTop + env->CallFloatMethod(jRect, m_javaGlue.m_rectFHeight);
378bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(rectClass);
3795065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    env->DeleteLocalRef(jRect);
3805065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    checkException(env);
3815065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark}
3825065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark
383b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clarkvoid resetCursorRing()
384b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark{
38532dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    m_ringAnimationEnd = 0;
386b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark    m_viewImpl->m_hasCursorBounds = false;
387b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark}
388b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark
38987962ce00229855c098ba12cee8d5c015a835289Cary Clarkbool drawCursorPreamble(CachedRoot* root)
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
391461c3fcad8dc54fa3240dcc0cb8989e690408578Cary Clark    const CachedFrame* frame;
392461c3fcad8dc54fa3240dcc0cb8989e690408578Cary Clark    const CachedNode* node = root->currentCursor(&frame);
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!node) {
39449e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark        DBG_NAV_LOGV("%s", "!node");
395b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark        resetCursorRing();
39687962ce00229855c098ba12cee8d5c015a835289Cary Clark        return false;
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
398cd8a18fcca4aaa5658aaf236b034516fccac7932Cary Clark    m_ring.setIsButton(node);
3993efa919a7f16fdb717e393f501c50d4844ffaed5Cary Clark    if (node->isHidden()) {
4003efa919a7f16fdb717e393f501c50d4844ffaed5Cary Clark        DBG_NAV_LOG("node->isHidden()");
40146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        m_viewImpl->m_hasCursorBounds = false;
40287962ce00229855c098ba12cee8d5c015a835289Cary Clark        return false;
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
404d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark#if USE(ACCELERATED_COMPOSITING)
405ea684c4f21a0b23ce2ca839f4e9f978d2d02de25Teng-Hui Zhu    if (node->isInLayer() && root->rootLayer()) {
406d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark        LayerAndroid* layer = const_cast<LayerAndroid*>(root->rootLayer());
407d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark        SkRect visible;
408d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark        calcOurContentVisibleRect(&visible);
409d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark        layer->updateFixedLayersPositions(visible);
410d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark        layer->updatePositions();
411d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark    }
412d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark#endif
413f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    setVisibleRect(root);
41487962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_ring.m_root = root;
41587962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_ring.m_frame = frame;
41687962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_ring.m_node = node;
41732dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    SkMSec time = SkTime::GetMSecs();
41832dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    m_ring.m_isPressed = time < m_ringAnimationEnd
41932dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark        && m_ringAnimationEnd != UINT_MAX;
42087962ce00229855c098ba12cee8d5c015a835289Cary Clark    return true;
42187962ce00229855c098ba12cee8d5c015a835289Cary Clark}
42287962ce00229855c098ba12cee8d5c015a835289Cary Clark
42387962ce00229855c098ba12cee8d5c015a835289Cary Clarkvoid drawCursorPostamble()
42487962ce00229855c098ba12cee8d5c015a835289Cary Clark{
42532dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    if (m_ringAnimationEnd == UINT_MAX)
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
42787962ce00229855c098ba12cee8d5c015a835289Cary Clark    SkMSec time = SkTime::GetMSecs();
42887962ce00229855c098ba12cee8d5c015a835289Cary Clark    if (time < m_ringAnimationEnd) {
42987962ce00229855c098ba12cee8d5c015a835289Cary Clark        // views assume that inval bounds coordinates are non-negative
43087962ce00229855c098ba12cee8d5c015a835289Cary Clark        WebCore::IntRect invalBounds(0, 0, INT_MAX, INT_MAX);
431ef1adcdfc805d4d13103f6f15cc5b4d96828a60fPatrick Scott        invalBounds.intersect(m_ring.m_absBounds);
43287962ce00229855c098ba12cee8d5c015a835289Cary Clark        postInvalidateDelayed(m_ringAnimationEnd - time, invalBounds);
43387962ce00229855c098ba12cee8d5c015a835289Cary Clark    } else {
4340924a66d1664f53afd148456e5709c471ff7240aCary Clark        hideCursor(const_cast<CachedRoot*>(m_ring.m_root));
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
43687962ce00229855c098ba12cee8d5c015a835289Cary Clark}
437846dd02baeb22227f22c9fda72e48f6810568c14Leon Scroggins
438a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardbool drawGL(WebCore::IntRect& viewRect, float scale, int extras)
439a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
440a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
4413deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger    if (!m_baseLayer || inFullScreenMode())
442a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        return false;
443a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
444e47399f767707497dfc68fc64b14621a8ca9959fTeng-Hui Zhu    if (!m_glWebViewState) {
445f3cef498906fce0a2d7787f7475f6df232baaeadCary Clark        m_glWebViewState = new GLWebViewState(&m_viewImpl->gButtonMutex);
446e47399f767707497dfc68fc64b14621a8ca9959fTeng-Hui Zhu        if (m_baseLayer->content()) {
447e47399f767707497dfc68fc64b14621a8ca9959fTeng-Hui Zhu            IntRect rect(0, 0, m_baseLayer->content()->width(), m_baseLayer->content()->height());
44803d850006e8ce54945fe44c36ffaf074143184c5Teng-Hui Zhu            m_glWebViewState->setBaseLayer(m_baseLayer, rect, false);
449e47399f767707497dfc68fc64b14621a8ca9959fTeng-Hui Zhu        }
450e47399f767707497dfc68fc64b14621a8ca9959fTeng-Hui Zhu    }
451c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger
452a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    CachedRoot* root = getFrameCache(AllowNewer);
453a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    if (!root) {
454a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        DBG_NAV_LOG("!root");
455a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        if (extras == DrawExtrasCursorRing)
456a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard            resetCursorRing();
457a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        return false;
458a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    }
459a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    DrawExtra* extra = 0;
460a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    switch (extras) {
461a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        case DrawExtrasFind:
462a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard            extra = &m_findOnPage;
463a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard            break;
464a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        case DrawExtrasSelection:
465a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard            extra = &m_selectText;
466a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard            break;
467a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        case DrawExtrasCursorRing:
468a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard            if (drawCursorPreamble(root) && m_ring.setup()) {
469a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard                if (!m_ring.m_isButton)
470a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard                    extra = &m_ring;
471a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard                drawCursorPostamble();
472a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard            }
473a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard            break;
474a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        default:
475a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard            ;
476a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    }
477a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
478c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    unsigned int pic = m_glWebViewState->currentPictureCounter();
479c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger
480eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark    SkPicture picture;
481eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark    IntRect rect(0, 0, 0, 0);
482cd8a18fcca4aaa5658aaf236b034516fccac7932Cary Clark    bool allowSame = false;
483a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    if (extra) {
484eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark        LayerAndroid mainPicture(m_navPictureUI);
485eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark        PictureSet* content = m_baseLayer->content();
486eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark        SkCanvas* canvas = picture.beginRecording(content->width(),
487eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark            content->height());
488eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark        extra->draw(canvas, &mainPicture, &rect);
489eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark        picture.endRecording();
490cd8a18fcca4aaa5658aaf236b034516fccac7932Cary Clark    } else if (extras == DrawExtrasCursorRing && m_ring.m_isButton) {
491cd8a18fcca4aaa5658aaf236b034516fccac7932Cary Clark        const CachedFrame* cachedFrame;
492cd8a18fcca4aaa5658aaf236b034516fccac7932Cary Clark        const CachedNode* cachedCursor = root->currentCursor(&cachedFrame);
493cd8a18fcca4aaa5658aaf236b034516fccac7932Cary Clark        if (cachedCursor) {
494cd8a18fcca4aaa5658aaf236b034516fccac7932Cary Clark            rect = cachedCursor->bounds(cachedFrame);
495cd8a18fcca4aaa5658aaf236b034516fccac7932Cary Clark            allowSame = true;
496cd8a18fcca4aaa5658aaf236b034516fccac7932Cary Clark        }
497a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    }
498cd8a18fcca4aaa5658aaf236b034516fccac7932Cary Clark    m_glWebViewState->setExtra(m_baseLayer, picture, rect, allowSame);
4990ca8045217bb9b308ddb407d7a9ce17d92d9f9fbNicolas Roard
5000ca8045217bb9b308ddb407d7a9ce17d92d9f9fbNicolas Roard    LayerAndroid* compositeLayer = compositeRoot();
5010ca8045217bb9b308ddb407d7a9ce17d92d9f9fbNicolas Roard    if (compositeLayer)
5020ca8045217bb9b308ddb407d7a9ce17d92d9f9fbNicolas Roard        compositeLayer->setExtra(extra);
5030ca8045217bb9b308ddb407d7a9ce17d92d9f9fbNicolas Roard
504a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    SkRect visibleRect;
505a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    calcOurContentVisibleRect(&visibleRect);
50681ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard    bool ret = m_glWebViewState->drawGL(viewRect, visibleRect, scale);
507c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    if (ret || m_glWebViewState->currentPictureCounter() != pic)
508a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        return true;
509a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
510a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    return false;
511a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
512a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
5136d43b9ceb777071c088fe12ee94af80e34816bcfGrace KlobaPictureSet* draw(SkCanvas* canvas, SkColor bgColor, int extras, bool split)
51487962ce00229855c098ba12cee8d5c015a835289Cary Clark{
5156d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    PictureSet* ret = 0;
5166d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (!m_baseLayer) {
5176d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        canvas->drawColor(bgColor);
5186d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return ret;
5196d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    }
5206d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
5216d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    // draw the content of the base layer first
5226d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    PictureSet* content = m_baseLayer->content();
5236d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    int sc = canvas->save(SkCanvas::kClip_SaveFlag);
5246d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    canvas->clipRect(SkRect::MakeLTRB(0, 0, content->width(),
5256d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba                content->height()), SkRegion::kDifference_Op);
5266d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    canvas->drawColor(bgColor);
5276d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    canvas->restoreToCount(sc);
5286d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (content->draw(canvas))
5296d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        ret = split ? new PictureSet(*content) : 0;
5306d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
53187962ce00229855c098ba12cee8d5c015a835289Cary Clark    CachedRoot* root = getFrameCache(AllowNewer);
53287962ce00229855c098ba12cee8d5c015a835289Cary Clark    if (!root) {
53387962ce00229855c098ba12cee8d5c015a835289Cary Clark        DBG_NAV_LOG("!root");
53487962ce00229855c098ba12cee8d5c015a835289Cary Clark        if (extras == DrawExtrasCursorRing)
53587962ce00229855c098ba12cee8d5c015a835289Cary Clark            resetCursorRing();
5366d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return ret;
537846dd02baeb22227f22c9fda72e48f6810568c14Leon Scroggins    }
53887962ce00229855c098ba12cee8d5c015a835289Cary Clark    LayerAndroid mainPicture(m_navPictureUI);
53987962ce00229855c098ba12cee8d5c015a835289Cary Clark    DrawExtra* extra = 0;
54087962ce00229855c098ba12cee8d5c015a835289Cary Clark    switch (extras) {
54187962ce00229855c098ba12cee8d5c015a835289Cary Clark        case DrawExtrasFind:
54287962ce00229855c098ba12cee8d5c015a835289Cary Clark            extra = &m_findOnPage;
54387962ce00229855c098ba12cee8d5c015a835289Cary Clark            break;
54487962ce00229855c098ba12cee8d5c015a835289Cary Clark        case DrawExtrasSelection:
54587962ce00229855c098ba12cee8d5c015a835289Cary Clark            extra = &m_selectText;
54687962ce00229855c098ba12cee8d5c015a835289Cary Clark            break;
54787962ce00229855c098ba12cee8d5c015a835289Cary Clark        case DrawExtrasCursorRing:
54887962ce00229855c098ba12cee8d5c015a835289Cary Clark            if (drawCursorPreamble(root) && m_ring.setup()) {
54987962ce00229855c098ba12cee8d5c015a835289Cary Clark                if (!m_ring.m_isButton)
55087962ce00229855c098ba12cee8d5c015a835289Cary Clark                    extra = &m_ring;
55187962ce00229855c098ba12cee8d5c015a835289Cary Clark                drawCursorPostamble();
55287962ce00229855c098ba12cee8d5c015a835289Cary Clark            }
55387962ce00229855c098ba12cee8d5c015a835289Cary Clark            break;
55487962ce00229855c098ba12cee8d5c015a835289Cary Clark        default:
55587962ce00229855c098ba12cee8d5c015a835289Cary Clark            ;
556846dd02baeb22227f22c9fda72e48f6810568c14Leon Scroggins    }
557eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark    if (extra) {
558eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark        IntRect dummy; // inval area, unused for now
559eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark        extra->draw(canvas, &mainPicture, &dummy);
560eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark    }
56187962ce00229855c098ba12cee8d5c015a835289Cary Clark#if USE(ACCELERATED_COMPOSITING)
5626d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    LayerAndroid* compositeLayer = compositeRoot();
5636d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (!compositeLayer)
5646d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return ret;
5656d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    compositeLayer->setExtra(extra);
5665065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    SkRect visible;
5675065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    calcOurContentVisibleRect(&visible);
56887962ce00229855c098ba12cee8d5c015a835289Cary Clark    // call this to be sure we've adjusted for any scrolling or animations
56987962ce00229855c098ba12cee8d5c015a835289Cary Clark    // before we actually draw
5706d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    compositeLayer->updateFixedLayersPositions(visible);
5716d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    compositeLayer->updatePositions();
5726d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    // We have to set the canvas' matrix on the base layer
573e93f34788b1f644f8be61a1daf6505c387e6fc3bNicolas Roard    // (to have fixed layers work as intended)
574e93f34788b1f644f8be61a1daf6505c387e6fc3bNicolas Roard    SkAutoCanvasRestore restore(canvas, true);
5756d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    m_baseLayer->setMatrix(canvas->getTotalMatrix());
576e93f34788b1f644f8be61a1daf6505c387e6fc3bNicolas Roard    canvas->resetMatrix();
5776d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    m_baseLayer->draw(canvas);
5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
5796d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    return ret;
5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
58287962ce00229855c098ba12cee8d5c015a835289Cary Clark
58346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkbool cursorIsTextInput(FrameCachePermission allowNewer)
5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
58546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    CachedRoot* root = getFrameCache(allowNewer);
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!root) {
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DBG_NAV_LOG("!root");
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
59046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedNode* cursor = root->currentCursor();
591f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark    if (!cursor) {
592f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark        DBG_NAV_LOG("!cursor");
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
594f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark    }
5951d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    DBG_NAV_LOGD("%s", cursor->isTextInput() ? "true" : "false");
5961d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    return cursor->isTextInput();
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkvoid cursorRingBounds(WebCore::IntRect* bounds)
6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DBG_NAV_LOGD("%s", "");
6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedRoot* root = getFrameCache(DontAllowNewer);
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (root) {
604f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark        const CachedFrame* cachedFrame;
605f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark        const CachedNode* cachedNode = root->currentCursor(&cachedFrame);
6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (cachedNode) {
607f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark            *bounds = cachedNode->cursorRingBounds(cachedFrame);
6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            DBG_NAV_LOGD("bounds={%d,%d,%d,%d}", bounds->x(), bounds->y(),
6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                bounds->width(), bounds->height());
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *bounds = WebCore::IntRect(0, 0, 0, 0);
6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
61636747fa778285f57f2f53c047028be83e9d8776dCary Clarkvoid fixCursor()
61736747fa778285f57f2f53c047028be83e9d8776dCary Clark{
61836747fa778285f57f2f53c047028be83e9d8776dCary Clark    m_viewImpl->gCursorBoundsMutex.lock();
61936747fa778285f57f2f53c047028be83e9d8776dCary Clark    bool hasCursorBounds = m_viewImpl->m_hasCursorBounds;
62036747fa778285f57f2f53c047028be83e9d8776dCary Clark    IntRect bounds = m_viewImpl->m_cursorBounds;
62136747fa778285f57f2f53c047028be83e9d8776dCary Clark    m_viewImpl->gCursorBoundsMutex.unlock();
62236747fa778285f57f2f53c047028be83e9d8776dCary Clark    if (!hasCursorBounds)
62336747fa778285f57f2f53c047028be83e9d8776dCary Clark        return;
62436747fa778285f57f2f53c047028be83e9d8776dCary Clark    int x, y;
62536747fa778285f57f2f53c047028be83e9d8776dCary Clark    const CachedFrame* frame;
626a34b1107b2542fa334fd4db2d58e2df849e083b0Cary Clark    const CachedNode* node = m_frameCacheUI->findAt(bounds, &frame, &x, &y, true);
62736747fa778285f57f2f53c047028be83e9d8776dCary Clark    if (!node)
62836747fa778285f57f2f53c047028be83e9d8776dCary Clark        return;
62936747fa778285f57f2f53c047028be83e9d8776dCary Clark    // require that node have approximately the same bounds (+/- 4) and the same
63036747fa778285f57f2f53c047028be83e9d8776dCary Clark    // center (+/- 2)
63136747fa778285f57f2f53c047028be83e9d8776dCary Clark    IntPoint oldCenter = IntPoint(bounds.x() + (bounds.width() >> 1),
63236747fa778285f57f2f53c047028be83e9d8776dCary Clark        bounds.y() + (bounds.height() >> 1));
633f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    IntRect newBounds = node->bounds(frame);
63436747fa778285f57f2f53c047028be83e9d8776dCary Clark    IntPoint newCenter = IntPoint(newBounds.x() + (newBounds.width() >> 1),
63536747fa778285f57f2f53c047028be83e9d8776dCary Clark        newBounds.y() + (newBounds.height() >> 1));
63636747fa778285f57f2f53c047028be83e9d8776dCary Clark    DBG_NAV_LOGD("oldCenter=(%d,%d) newCenter=(%d,%d)"
63736747fa778285f57f2f53c047028be83e9d8776dCary Clark        " bounds=(%d,%d,w=%d,h=%d) newBounds=(%d,%d,w=%d,h=%d)",
63836747fa778285f57f2f53c047028be83e9d8776dCary Clark        oldCenter.x(), oldCenter.y(), newCenter.x(), newCenter.y(),
63936747fa778285f57f2f53c047028be83e9d8776dCary Clark        bounds.x(), bounds.y(), bounds.width(), bounds.height(),
64036747fa778285f57f2f53c047028be83e9d8776dCary Clark        newBounds.x(), newBounds.y(), newBounds.width(), newBounds.height());
64136747fa778285f57f2f53c047028be83e9d8776dCary Clark    if (abs(oldCenter.x() - newCenter.x()) > 2)
64236747fa778285f57f2f53c047028be83e9d8776dCary Clark        return;
64336747fa778285f57f2f53c047028be83e9d8776dCary Clark    if (abs(oldCenter.y() - newCenter.y()) > 2)
64436747fa778285f57f2f53c047028be83e9d8776dCary Clark        return;
64536747fa778285f57f2f53c047028be83e9d8776dCary Clark    if (abs(bounds.x() - newBounds.x()) > 4)
64636747fa778285f57f2f53c047028be83e9d8776dCary Clark        return;
64736747fa778285f57f2f53c047028be83e9d8776dCary Clark    if (abs(bounds.y() - newBounds.y()) > 4)
64836747fa778285f57f2f53c047028be83e9d8776dCary Clark        return;
64936747fa778285f57f2f53c047028be83e9d8776dCary Clark    if (abs(bounds.right() - newBounds.right()) > 4)
65036747fa778285f57f2f53c047028be83e9d8776dCary Clark        return;
65136747fa778285f57f2f53c047028be83e9d8776dCary Clark    if (abs(bounds.bottom() - newBounds.bottom()) > 4)
65236747fa778285f57f2f53c047028be83e9d8776dCary Clark        return;
65336747fa778285f57f2f53c047028be83e9d8776dCary Clark    DBG_NAV_LOGD("node=%p frame=%p x=%d y=%d bounds=(%d,%d,w=%d,h=%d)",
65436747fa778285f57f2f53c047028be83e9d8776dCary Clark        node, frame, x, y, bounds.x(), bounds.y(), bounds.width(),
65536747fa778285f57f2f53c047028be83e9d8776dCary Clark        bounds.height());
65636747fa778285f57f2f53c047028be83e9d8776dCary Clark    m_frameCacheUI->setCursor(const_cast<CachedFrame*>(frame),
65736747fa778285f57f2f53c047028be83e9d8776dCary Clark        const_cast<CachedNode*>(node));
65836747fa778285f57f2f53c047028be83e9d8776dCary Clark}
65936747fa778285f57f2f53c047028be83e9d8776dCary Clark
6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCachedRoot* getFrameCache(FrameCachePermission allowNewer)
6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
66246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    if (!m_viewImpl->m_updatedFrameCache) {
66349e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark        DBG_NAV_LOGV("%s", "!m_viewImpl->m_updatedFrameCache");
6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_frameCacheUI;
66546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    }
66646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    if (allowNewer == DontAllowNewer && m_viewImpl->m_lastGeneration < m_generation) {
66746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        DBG_NAV_LOGD("allowNewer==DontAllowNewer m_viewImpl->m_lastGeneration=%d"
66846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark            " < m_generation=%d", m_viewImpl->m_lastGeneration, m_generation);
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_frameCacheUI;
67046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    }
6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DBG_NAV_LOGD("%s", "m_viewImpl->m_updatedFrameCache == true");
672f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedFrame* oldCursorFrame;
673f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedNode* oldCursorNode = m_frameCacheUI ?
674f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark        m_frameCacheUI->currentCursor(&oldCursorFrame) : 0;
675f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark#if USE(ACCELERATED_COMPOSITING)
676be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark    int layerId = -1;
677be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark    if (oldCursorNode && oldCursorNode->isInLayer()) {
678be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark        const LayerAndroid* cursorLayer = oldCursorFrame->layer(oldCursorNode)
679be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark            ->layer(m_frameCacheUI->rootLayer());
680be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark        if (cursorLayer)
681be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark            layerId = cursorLayer->uniqueId();
682be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark    }
683f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark#endif
684f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    // get id from old layer and use to find new layer
6853a752d13620eb15148e87a028d66932c74a27993Cary Clark    bool oldFocusIsTextInput = false;
6863a752d13620eb15148e87a028d66932c74a27993Cary Clark    void* oldFocusNodePointer = 0;
6873a752d13620eb15148e87a028d66932c74a27993Cary Clark    if (m_frameCacheUI) {
6883a752d13620eb15148e87a028d66932c74a27993Cary Clark        const CachedNode* oldFocus = m_frameCacheUI->currentFocus();
6893a752d13620eb15148e87a028d66932c74a27993Cary Clark        if (oldFocus) {
6903a752d13620eb15148e87a028d66932c74a27993Cary Clark            oldFocusIsTextInput = oldFocus->isTextInput();
6913a752d13620eb15148e87a028d66932c74a27993Cary Clark            oldFocusNodePointer = oldFocus->nodePointer();
6923a752d13620eb15148e87a028d66932c74a27993Cary Clark        }
6933a752d13620eb15148e87a028d66932c74a27993Cary Clark    }
6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewImpl->gFrameCacheMutex.lock();
6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete m_frameCacheUI;
696b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger    SkSafeUnref(m_navPictureUI);
6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewImpl->m_updatedFrameCache = false;
6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frameCacheUI = m_viewImpl->m_frameCacheKit;
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_navPictureUI = m_viewImpl->m_navPictureKit;
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewImpl->m_frameCacheKit = 0;
7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewImpl->m_navPictureKit = 0;
7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewImpl->gFrameCacheMutex.unlock();
703f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    if (m_frameCacheUI)
7046d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        m_frameCacheUI->setRootLayer(compositeRoot());
705f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark#if USE(ACCELERATED_COMPOSITING)
706f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    if (layerId >= 0) {
7075065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark        SkRect visible;
7085065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark        calcOurContentVisibleRect(&visible);
709f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark        LayerAndroid* layer = const_cast<LayerAndroid*>(
710cdd7f6d80774ba3a374f09f22f7cb6bcfca24fa5Mike Reed                                                m_frameCacheUI->rootLayer());
711cdd7f6d80774ba3a374f09f22f7cb6bcfca24fa5Mike Reed        if (layer) {
712fa26a8dd531dff44d6cad0700ff32c0bb949392cNicolas Roard            layer->updateFixedLayersPositions(visible);
713fa26a8dd531dff44d6cad0700ff32c0bb949392cNicolas Roard            layer->updatePositions();
714cdd7f6d80774ba3a374f09f22f7cb6bcfca24fa5Mike Reed        }
715f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    }
716f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark#endif
71736747fa778285f57f2f53c047028be83e9d8776dCary Clark    fixCursor();
7183a752d13620eb15148e87a028d66932c74a27993Cary Clark    if (oldFocusIsTextInput) {
71995fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins        const CachedNode* newFocus = m_frameCacheUI->currentFocus();
7203a752d13620eb15148e87a028d66932c74a27993Cary Clark        if (newFocus && oldFocusNodePointer != newFocus->nodePointer()
7213a752d13620eb15148e87a028d66932c74a27993Cary Clark                && newFocus->isTextInput()
72295fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins                && newFocus != m_frameCacheUI->currentCursor()) {
72395fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins            // The focus has changed.  We may need to update things.
72495fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins            LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
72595fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins            JNIEnv* env = JSC::Bindings::getJNIEnv();
72695fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins            env->CallVoidMethod(m_javaGlue.object(env).get(),
72795fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins                    m_javaGlue.m_domChangedFocus);
72895fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins            checkException(env);
72995fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins        }
73095fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins    }
731f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    if (oldCursorNode && (!m_frameCacheUI || !m_frameCacheUI->currentCursor()))
73246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        viewInvalidate(); // redraw in case cursor ring is still visible
7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_frameCacheUI;
7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint getScaledMaxXScroll()
7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
7403bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott    int result = env->CallIntMethod(m_javaGlue.object(env).get(), m_javaGlue.m_getScaledMaxXScroll);
7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint getScaledMaxYScroll()
7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
7493bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott    int result = env->CallIntMethod(m_javaGlue.object(env).get(), m_javaGlue.m_getScaledMaxYScroll);
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
754af03a3d6830584ef606be2d1c64845815dadb146Cary ClarkIntRect getVisibleRect()
7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
756af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    IntRect rect;
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
7593bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott    jobject jRect = env->CallObjectMethod(m_javaGlue.object(env).get(), m_javaGlue.m_getVisibleRect);
7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
761af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    rect.setX(env->GetIntField(jRect, m_javaGlue.m_rectLeft));
7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
763af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    rect.setY(env->GetIntField(jRect, m_javaGlue.m_rectTop));
7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
765af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    rect.setWidth(env->CallIntMethod(jRect, m_javaGlue.m_rectWidth));
7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
767af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    rect.setHeight(env->CallIntMethod(jRect, m_javaGlue.m_rectHeight));
7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    env->DeleteLocalRef(jRect);
7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
771af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    return rect;
7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
774652e9a017a7c5c772361bf57279fae0c26992329Jeff Brownstatic CachedFrame::Direction KeyToDirection(int32_t keyCode)
7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (keyCode) {
777652e9a017a7c5c772361bf57279fae0c26992329Jeff Brown        case AKEYCODE_DPAD_RIGHT:
7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            DBG_NAV_LOGD("keyCode=%s", "right");
7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return CachedFrame::RIGHT;
780652e9a017a7c5c772361bf57279fae0c26992329Jeff Brown        case AKEYCODE_DPAD_LEFT:
7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            DBG_NAV_LOGD("keyCode=%s", "left");
7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return CachedFrame::LEFT;
783652e9a017a7c5c772361bf57279fae0c26992329Jeff Brown        case AKEYCODE_DPAD_DOWN:
7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            DBG_NAV_LOGD("keyCode=%s", "down");
7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return CachedFrame::DOWN;
786652e9a017a7c5c772361bf57279fae0c26992329Jeff Brown        case AKEYCODE_DPAD_UP:
7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            DBG_NAV_LOGD("keyCode=%s", "up");
7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return CachedFrame::UP;
7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
790b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark            DBG_NAV_LOGD("bad key %d sent", keyCode);
7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return CachedFrame::UNINITIALIZED;
7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
79545b64f60af3cbfa8c78388e35e9b669a0c284bdcBen MurdochWTF::String imageURI(int x, int y)
7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CachedRoot* root = getFrameCache(DontAllowNewer);
79845b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch    return root ? root->imageURI(x, y) : WTF::String();
7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
801f4669cac3858848a9247e801b6106aeae6d406e8Cary Clarkbool cursorWantsKeyEvents()
8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CachedRoot* root = getFrameCache(DontAllowNewer);
8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (root) {
805f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark        const CachedNode* focus = root->currentCursor();
80646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        if (focus)
807f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark            return focus->wantsKeyEvents();
8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
8108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
81269bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins
81346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark/* returns true if the key had no effect (neither scrolled nor changed cursor) */
8144ca8bc94f71466d1109bfbb9ef00da3256a0899bCary Clarkbool moveCursor(int keyCode, int count, bool ignoreScroll)
8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedRoot* root = getFrameCache(AllowNewer);
8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!root) {
8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DBG_NAV_LOG("!root");
8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
82246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    m_viewImpl->m_moveGeneration++;
823652e9a017a7c5c772361bf57279fae0c26992329Jeff Brown    CachedFrame::Direction direction = KeyToDirection(keyCode);
8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CachedFrame* cachedFrame, * oldFrame = 0;
82546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedNode* cursor = root->currentCursor(&oldFrame);
82646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    WebCore::IntPoint cursorLocation = root->cursorLocation();
82746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    DBG_NAV_LOGD("old cursor %d (nativeNode=%p) cursorLocation={%d, %d}",
82846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        cursor ? cursor->index() : 0,
82946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        cursor ? cursor->nodePointer() : 0, cursorLocation.x(), cursorLocation.y());
830f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    WebCore::IntRect visibleRect = setVisibleRect(root);
8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int xMax = getScaledMaxXScroll();
8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int yMax = getScaledMaxYScroll();
8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    root->setMaxScroll(xMax, yMax);
8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CachedNode* cachedNode = 0;
8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int dx = 0;
8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int dy = 0;
8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int counter = count;
8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (--counter >= 0) {
8398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebCore::IntPoint scroll = WebCore::IntPoint(0, 0);
84046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        cachedNode = root->moveCursor(direction, &cachedFrame, &scroll);
8418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        dx += scroll.x();
8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        dy += scroll.y();
8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
84446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    DBG_NAV_LOGD("new cursor %d (nativeNode=%p) cursorLocation={%d, %d}"
84546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        "bounds={%d,%d,w=%d,h=%d}", cachedNode ? cachedNode->index() : 0,
84646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        cachedNode ? cachedNode->nodePointer() : 0,
84746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark            root->cursorLocation().x(), root->cursorLocation().y(),
848f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark            cachedNode ? cachedNode->bounds(cachedFrame).x() : 0,
849f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark            cachedNode ? cachedNode->bounds(cachedFrame).y() : 0,
850f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark            cachedNode ? cachedNode->bounds(cachedFrame).width() : 0,
851f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark            cachedNode ? cachedNode->bounds(cachedFrame).height() : 0);
8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If !m_heightCanMeasure (such as in the browser), we want to scroll no
8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // matter what
8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!ignoreScroll && (!m_heightCanMeasure ||
8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            !cachedNode ||
85646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark            (cursor && cursor->nodePointer() == cachedNode->nodePointer())))
8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (count == 1 && dx != 0 && dy == 0 && -m_lastDx == dx &&
8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                SkTime::GetMSecs() - m_lastDxTime < 1000)
8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            root->checkForJiggle(&dx);
8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DBG_NAV_LOGD("scrollBy %d,%d", dx, dy);
8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ((dx | dy))
8638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            this->scrollBy(dx, dy);
8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_lastDx = dx;
8658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_lastDxTime = SkTime::GetMSecs();
8668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool result = false;
8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (cachedNode) {
86932dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark        showCursorUntimed();
87087962ce00229855c098ba12cee8d5c015a835289Cary Clark        m_viewImpl->updateCursorBounds(root, cachedFrame, cachedNode);
87190bd422df8e04c486d29c4041acf1c4cf7c3b155Leon Scroggins        root->setCursor(const_cast<CachedFrame*>(cachedFrame),
87290bd422df8e04c486d29c4041acf1c4cf7c3b155Leon Scroggins                const_cast<CachedNode*>(cachedNode));
8734ba38126aa5964cd2e1922f3234c745032b5db59Leon Scroggins        const CachedNode* focus = root->currentFocus();
8740a506c68f4ad915ee62e7bf4f22f58b24d078d56Leon Scroggins        bool clearTextEntry = cachedNode != focus && focus
8750a506c68f4ad915ee62e7bf4f22f58b24d078d56Leon Scroggins                && cachedNode->nodePointer() != focus->nodePointer() && focus->isTextInput();
87694f12574c74b11db011b994e462f64a112952a47Leon Scroggins        // Stop painting the caret if the old focus was a text input and so is the new cursor.
87794f12574c74b11db011b994e462f64a112952a47Leon Scroggins        bool stopPaintingCaret = clearTextEntry && cachedNode->wantsKeyEvents();
87894f12574c74b11db011b994e462f64a112952a47Leon Scroggins        sendMoveMouseIfLatest(clearTextEntry, stopPaintingCaret);
8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int docHeight = root->documentHeight();
8818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int docWidth = root->documentWidth();
8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (visibleRect.bottom() + dy > docHeight)
8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            dy = docHeight - visibleRect.bottom();
8848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (visibleRect.y() + dy < 0)
8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            dy = -visibleRect.y();
8868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (visibleRect.right() + dx > docWidth)
8878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            dx = docWidth - visibleRect.right();
8888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (visibleRect.x() < 0)
8898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            dx = -visibleRect.x();
8908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = direction == CachedFrame::LEFT ? dx >= 0 :
8918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            direction == CachedFrame::RIGHT ? dx <= 0 :
8928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            direction == CachedFrame::UP ? dy >= 0 : dy <= 0;
8938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
8958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid notifyProgressFinished()
8988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
89946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    DBG_NAV_LOGD("cursorIsTextInput=%d", cursorIsTextInput(DontAllowNewer));
90095fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins    rebuildWebTextView();
9018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if DEBUG_NAV_UI
9028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_frameCacheUI) {
9038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const CachedNode* focus = m_frameCacheUI->currentFocus();
9048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DBG_NAV_LOGD("focus %d (nativeNode=%p)",
9058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            focus ? focus->index() : 0,
9068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            focus ? focus->nodePointer() : 0);
9078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
9098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst CachedNode* findAt(CachedRoot* root, const WebCore::IntRect& rect,
9128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CachedFrame** framePtr, int* rxPtr, int* ryPtr)
9138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *rxPtr = 0;
9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *ryPtr = 0;
9168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *framePtr = 0;
9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!root)
9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
919f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    setVisibleRect(root);
920f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    return root->findAt(rect, framePtr, rxPtr, ryPtr, true);
921f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark}
922f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark
923f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary ClarkIntRect setVisibleRect(CachedRoot* root)
924f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{
925af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    IntRect visibleRect = getVisibleRect();
926f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    DBG_NAV_LOGD("getVisibleRect %d,%d,%d,%d",
927f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark        visibleRect.x(), visibleRect.y(), visibleRect.width(), visibleRect.height());
9288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    root->setVisibleRect(visibleRect);
929f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    return visibleRect;
9308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid selectBestAt(const WebCore::IntRect& rect)
9338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CachedFrame* frame;
9358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int rx, ry;
936f1610d01f92cb77827d2de13c0ed38554e4f0790Cary Clark    CachedRoot* root = getFrameCache(AllowNewer);
937f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    if (!root)
938f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        return;
9398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CachedNode* node = findAt(root, rect, &frame, &rx, &ry);
9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!node) {
9418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DBG_NAV_LOGD("no nodes found root=%p", root);
94269bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins        m_viewImpl->m_hasCursorBounds = false;
943b41f6483040a4269f2761648f5fa528ca602df5dCary Clark        root->setCursor(0, 0);
94432dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark        viewInvalidate();
94546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    } else {
94646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        DBG_NAV_LOGD("CachedNode:%p (%d)", node, node->index());
947ef1adcdfc805d4d13103f6f15cc5b4d96828a60fPatrick Scott        WebCore::IntRect bounds = node->bounds(frame);
948b0c9a2b4033eca931163e8223d7eaa8889337144Patrick Scott        root->rootHistory()->setMouseBounds(bounds);
94987962ce00229855c098ba12cee8d5c015a835289Cary Clark        m_viewImpl->updateCursorBounds(root, frame, node);
95032dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark        showCursorTimed();
95146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        root->setCursor(const_cast<CachedFrame*>(frame),
95290bd422df8e04c486d29c4041acf1c4cf7c3b155Leon Scroggins                const_cast<CachedNode*>(node));
9538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
95494f12574c74b11db011b994e462f64a112952a47Leon Scroggins    sendMoveMouseIfLatest(false, false);
955b41f6483040a4269f2761648f5fa528ca602df5dCary Clark    if (!node)
956b41f6483040a4269f2761648f5fa528ca602df5dCary Clark        return;
9578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
959d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkconst CachedNode* m_cacheHitNode;
960d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkconst CachedFrame* m_cacheHitFrame;
961d4924af12855cd19162ba1442a6055664c98ca32Cary Clark
962d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkbool pointInNavCache(int x, int y, int slop)
963d4924af12855cd19162ba1442a6055664c98ca32Cary Clark{
964d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    CachedRoot* root = getFrameCache(AllowNewer);
965d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    if (!root)
966d4924af12855cd19162ba1442a6055664c98ca32Cary Clark        return false;
967d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    IntRect rect = IntRect(x - slop, y - slop, slop * 2, slop * 2);
968d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    int rx, ry;
969d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    return (m_cacheHitNode = findAt(root, rect, &m_cacheHitFrame, &rx, &ry));
970d4924af12855cd19162ba1442a6055664c98ca32Cary Clark}
971d4924af12855cd19162ba1442a6055664c98ca32Cary Clark
97246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkbool motionUp(int x, int y, int slop)
9738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool pageScrolled = false;
975d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    IntRect rect = IntRect(x - slop, y - slop, slop * 2, slop * 2);
9768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int rx, ry;
9778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedRoot* root = getFrameCache(AllowNewer);
97873d131bc28aa2a68fe686ffd9426814448f5da7bCary Clark    if (!root)
979d4924af12855cd19162ba1442a6055664c98ca32Cary Clark        return 0;
980d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    const CachedFrame* frame = 0;
981af3b7507bd6d2b10fce43aa0728b8afcf5cddd86Cary Clark    const CachedNode* result = findAt(root, rect, &frame, &rx, &ry);
982ec079933211eb47479b2624cb6be72257d178c01Cary Clark    CachedHistory* history = root->rootHistory();
9838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!result) {
9848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DBG_NAV_LOGD("no nodes found root=%p", root);
985ec079933211eb47479b2624cb6be72257d178c01Cary Clark        history->setNavBounds(rect);
98669bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins        m_viewImpl->m_hasCursorBounds = false;
98769bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins        root->hideCursor();
98869bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins        int dx = root->checkForCenter(x, y);
98969bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins        if (dx) {
99069bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins            scrollBy(dx, 0);
99169bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins            pageScrolled = true;
9928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
99346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        sendMotionUp(frame ? (WebCore::Frame*) frame->framePointer() : 0,
994ee260612d8744993644f2e0b0f1fed51423be6dbLeon Scroggins            0, x, y);
99546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        viewInvalidate();
9968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return pageScrolled;
9978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DBG_NAV_LOGD("CachedNode:%p (%d) x=%d y=%d rx=%d ry=%d", result,
9998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result->index(), x, y, rx, ry);
100015f1e443f22288ee82cde972517ebf3cc1153d97Leon Scroggins    WebCore::IntRect navBounds = WebCore::IntRect(rx, ry, 1, 1);
1001ec079933211eb47479b2624cb6be72257d178c01Cary Clark    history->setNavBounds(navBounds);
1002ec079933211eb47479b2624cb6be72257d178c01Cary Clark    history->setMouseBounds(navBounds);
100387962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_viewImpl->updateCursorBounds(root, frame, result);
100446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    root->setCursor(const_cast<CachedFrame*>(frame),
10058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const_cast<CachedNode*>(result));
100632dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    if (result->isSyntheticLink())
100732dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark        overrideUrlLoading(result->getExport());
100832dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    else {
100946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        sendMotionUp(
101034bca311c8205ee40379adac2ef4da01e401600eCary Clark            (WebCore::Frame*) frame->framePointer(),
1011ee260612d8744993644f2e0b0f1fed51423be6dbLeon Scroggins            (WebCore::Node*) result->nodePointer(), rx, ry);
101246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    }
101332dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    if (result->isTextInput() || result->isSelect()
101432dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark            || result->isContentEditable()) {
101532dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark        showCursorUntimed();
101632dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    } else
101732dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark        showCursorTimed();
10188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return pageScrolled;
10198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
102182f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if USE(ACCELERATED_COMPOSITING)
1022f81c672a4f5c06621000a6df0984cde689397d94Cary Clarkstatic const ScrollableLayerAndroid* findScrollableLayer(
1023f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    const LayerAndroid* parent, int x, int y, SkIRect* foundBounds) {
102482f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    SkRect bounds;
102582f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    parent->bounds(&bounds);
102682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    // Check the parent bounds first; this will clip to within a masking layer's
102782f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    // bounds.
1028fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott    if (parent->masksToBounds() && !bounds.contains(x, y))
102982f247bdbb98dd80c44209d87692c650c3704617Patrick Scott        return 0;
103082f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    // Move the hit test local to parent.
103182f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    x -= bounds.fLeft;
103282f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    y -= bounds.fTop;
103382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    int count = parent->countChildren();
10341a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott    while (count--) {
10351a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott        const LayerAndroid* child = parent->getChild(count);
1036f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        const ScrollableLayerAndroid* result = findScrollableLayer(child, x, y,
1037f81c672a4f5c06621000a6df0984cde689397d94Cary Clark            foundBounds);
1038f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        if (result) {
1039f81c672a4f5c06621000a6df0984cde689397d94Cary Clark            foundBounds->offset(bounds.fLeft, bounds.fTop);
1040f81c672a4f5c06621000a6df0984cde689397d94Cary Clark            if (parent->masksToBounds()) {
1041f81c672a4f5c06621000a6df0984cde689397d94Cary Clark                if (bounds.width() < foundBounds->width())
1042f81c672a4f5c06621000a6df0984cde689397d94Cary Clark                    foundBounds->fRight = foundBounds->fLeft + bounds.width();
1043f81c672a4f5c06621000a6df0984cde689397d94Cary Clark                if (bounds.height() < foundBounds->height())
1044f81c672a4f5c06621000a6df0984cde689397d94Cary Clark                    foundBounds->fBottom = foundBounds->fTop + bounds.height();
1045f81c672a4f5c06621000a6df0984cde689397d94Cary Clark            }
104682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott            return result;
1047f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        }
104882f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    }
1049f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    if (parent->contentIsScrollable()) {
1050f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        foundBounds->set(0, 0, bounds.width(), bounds.height());
1051fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott        return static_cast<const ScrollableLayerAndroid*>(parent);
1052f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    }
105382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    return 0;
105482f247bdbb98dd80c44209d87692c650c3704617Patrick Scott}
105582f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif
105682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott
1057f81c672a4f5c06621000a6df0984cde689397d94Cary Clarkint scrollableLayer(int x, int y, SkIRect* layerRect, SkIRect* bounds)
1058a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{
105982f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if USE(ACCELERATED_COMPOSITING)
1060af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    const LayerAndroid* layerRoot = compositeRoot();
1061af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    if (!layerRoot)
1062a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        return 0;
1063f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    const ScrollableLayerAndroid* result = findScrollableLayer(layerRoot, x, y,
1064f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        bounds);
106522e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott    if (result) {
106622e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott        result->getScrollRect(layerRect);
10678598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott        return result->uniqueId();
106822e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott    }
1069a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#endif
1070a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    return 0;
1071a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott}
1072a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott
1073fa768f11d82c34980cce020f442329299efb08caCary Clarkint getBlockLeftEdge(int x, int y, float scale)
1074a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba{
1075a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba    CachedRoot* root = getFrameCache(AllowNewer);
1076a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba    if (root)
1077fa768f11d82c34980cce020f442329299efb08caCary Clark        return root->getBlockLeftEdge(x, y, scale);
1078a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba    return -1;
1079a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba}
1080a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba
108145b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdochvoid overrideUrlLoading(const WTF::String& url)
10828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
108479b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block    jstring jName = wtfStringToJstring(env, url);
10853bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott    env->CallVoidMethod(m_javaGlue.object(env).get(),
10863bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott            m_javaGlue.m_overrideLoading, jName);
10878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    env->DeleteLocalRef(jName);
10888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid setFindIsUp(bool up)
10918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1092afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    DBG_NAV_LOGD("up=%d", up);
10938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewImpl->m_findIsUp = up;
1094afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark}
1095afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark
1096afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clarkvoid setFindIsEmpty()
1097afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark{
1098afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    DBG_NAV_LOG("");
1099afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    m_findOnPage.clearCurrentLocation();
11008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
110232dffb883f56b18019afa7a01b2564b993b3fe8eCary Clarkvoid showCursorTimed()
11038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
110432dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    DBG_NAV_LOG("");
110532dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    m_ringAnimationEnd = SkTime::GetMSecs() + 500;
110632dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    viewInvalidate();
110732dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark}
110832dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark
110932dffb883f56b18019afa7a01b2564b993b3fe8eCary Clarkvoid showCursorUntimed()
111032dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark{
111132dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    DBG_NAV_LOG("");
11127a69d7c255012f3fcc4d9af040600eac1b2e5c56Cary Clark    m_ring.m_isPressed = false;
111332dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    m_ringAnimationEnd = UINT_MAX;
111432dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    viewInvalidate();
11158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid setHeightCanMeasure(bool measure)
11188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
11198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_heightCanMeasure = measure;
11208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
112287962ce00229855c098ba12cee8d5c015a835289Cary ClarkString getSelection()
11238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
112487962ce00229855c098ba12cee8d5c015a835289Cary Clark    return m_selectText.getSelection();
11258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1127a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkvoid moveSelection(int x, int y)
11288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1129af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    m_selectText.moveSelection(getVisibleRect(), x, y);
11308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1132515943cc7c9a60faa661739271d5fa14fcba9df8Cary ClarkIntPoint selectableText()
1133515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark{
1134515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    const CachedRoot* root = getFrameCache(DontAllowNewer);
1135515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    if (!root)
1136515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark        return IntPoint(0, 0);
1137515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    return m_selectText.selectableText(root);
1138515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark}
1139515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark
1140a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkvoid selectAll()
1141a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
1142af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    m_selectText.selectAll();
1143a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1144a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1145a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkint selectionX()
1146a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
1147a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return m_selectText.selectionX();
1148a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1149a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1150a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkint selectionY()
1151a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
1152a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return m_selectText.selectionY();
1153a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1154a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1155a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkvoid resetSelection()
1156a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
1157a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    m_selectText.reset();
1158a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1159a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1160a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkbool startSelection(int x, int y)
1161a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
1162af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    const CachedRoot* root = getFrameCache(DontAllowNewer);
1163af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    if (!root)
1164af03a3d6830584ef606be2d1c64845815dadb146Cary Clark        return false;
1165af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    return m_selectText.startSelection(root, getVisibleRect(), x, y);
1166a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1167a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1168a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkbool wordSelection(int x, int y)
1169a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
11709432ba4878ebf79acd4424398b344c154f452db2Cary Clark    const CachedRoot* root = getFrameCache(DontAllowNewer);
11719432ba4878ebf79acd4424398b344c154f452db2Cary Clark    if (!root)
1172a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        return false;
11739432ba4878ebf79acd4424398b344c154f452db2Cary Clark    return m_selectText.wordSelection(root, getVisibleRect(), x, y);
1174a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1175a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1176a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkbool extendSelection(int x, int y)
1177a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
1178af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    m_selectText.extendSelection(getVisibleRect(), x, y);
1179a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return true;
1180a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1181a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1182a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkbool hitSelection(int x, int y)
1183a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
1184a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return m_selectText.hitSelection(x, y);
1185a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1186a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1187a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkvoid setExtendSelection()
1188a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
1189a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    m_selectText.setExtendSelection(true);
1190a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1191a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1192a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkvoid setSelectionPointer(bool set, float scale, int x, int y)
11938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
119487962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_selectText.setDrawPointer(set);
119587962ce00229855c098ba12cee8d5c015a835289Cary Clark    if (!set)
119687962ce00229855c098ba12cee8d5c015a835289Cary Clark        return;
119787962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_selectText.m_inverseScale = scale;
119887962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_selectText.m_selectX = x;
119987962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_selectText.m_selectY = y;
12008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1202bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scrogginsvoid sendMoveFocus(WebCore::Frame* framePtr, WebCore::Node* nodePtr)
1203bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins{
12045e5962825729a211e093fd615ddc9e5b0bec10bdCary Clark    DBG_NAV_LOGD("framePtr=%p nodePtr=%p", framePtr, nodePtr);
1205bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins    JNIEnv* env = JSC::Bindings::getJNIEnv();
12060f201b80d05708e2cbadb19333e9cdb2aedfcb62Leon Scroggins    env->CallVoidMethod(m_javaGlue.object(env).get(),
12070f201b80d05708e2cbadb19333e9cdb2aedfcb62Leon Scroggins        m_javaGlue.m_sendMoveFocus, (jint) framePtr, (jint) nodePtr);
1208bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins    checkException(env);
1209bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins}
1210bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins
121146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkvoid sendMoveMouse(WebCore::Frame* framePtr, WebCore::Node* nodePtr, int x, int y)
12128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DBG_NAV_LOGD("framePtr=%p nodePtr=%p x=%d y=%d", framePtr, nodePtr, x, y);
12148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
12153bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott    env->CallVoidMethod(m_javaGlue.object(env).get(), m_javaGlue.m_sendMoveMouse,
12168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (jint) framePtr, (jint) nodePtr, x, y);
12178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
12188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
122094f12574c74b11db011b994e462f64a112952a47Leon Scrogginsvoid sendMoveMouseIfLatest(bool clearTextEntry, bool stopPaintingCaret)
12218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
12238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
12243bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott    env->CallVoidMethod(m_javaGlue.object(env).get(),
122594f12574c74b11db011b994e462f64a112952a47Leon Scroggins            m_javaGlue.m_sendMoveMouseIfLatest, clearTextEntry, stopPaintingCaret);
12268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
12278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
122946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkvoid sendMotionUp(
1230ee260612d8744993644f2e0b0f1fed51423be6dbLeon Scroggins    WebCore::Frame* framePtr, WebCore::Node* nodePtr, int x, int y)
12318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1232f514da7c6b4891ba0db5043e7be58bb49df9a72cLeon Scroggins    m_viewImpl->m_touchGeneration = ++m_generation;
12339d04f66389be496d5c6336ea09550dc4086b7f85Cary Clark    DBG_NAV_LOGD("m_generation=%d framePtr=%p nodePtr=%p x=%d y=%d",
12349d04f66389be496d5c6336ea09550dc4086b7f85Cary Clark        m_generation, framePtr, nodePtr, x, y);
12358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(m_javaGlue.m_obj, "A WebView was not associated with this WebViewNative!");
12368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
12373bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott    env->CallVoidMethod(m_javaGlue.object(env).get(), m_javaGlue.m_sendMotionUp,
1238ee260612d8744993644f2e0b0f1fed51423be6dbLeon Scroggins        m_generation, (jint) framePtr, (jint) nodePtr, x, y);
12398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
12408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid findNext(bool forward)
12438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1244f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    m_findOnPage.findNext(forward);
12455065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    if (!m_findOnPage.currentMatchIsInLayer())
12465065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark        scrollRectOnScreen(m_findOnPage.currentMatchBounds());
12478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    viewInvalidate();
12488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// With this call, WebView takes ownership of matches, and is responsible for
12518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// deleting it.
1252db17cf1782eab2488aab0933add6c79b21639c08Leon Scrogginsvoid setMatches(WTF::Vector<MatchInfo>* matches, jboolean sameAsLastSearch)
1253db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins{
1254db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    // If this search is the same as the last one, check against the old
1255db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    // location to determine whether to scroll.  If the same word is found
1256db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    // in the same place, then do not scroll.
1257db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    IntRect oldLocation;
1258db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    bool checkAgainstOldLocation;
1259db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    if (sameAsLastSearch && m_findOnPage.isCurrentLocationValid()) {
1260db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins        oldLocation = m_findOnPage.currentMatchBounds();
1261db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins        checkAgainstOldLocation = true;
1262db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    } else
1263db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins        checkAgainstOldLocation = false;
1264db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins
1265f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    m_findOnPage.setMatches(matches);
1266db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins
1267db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    if (!checkAgainstOldLocation
1268db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins            || oldLocation != m_findOnPage.currentMatchBounds()) {
1269db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins        // FIXME: Need to scroll if the match is in a layer.
1270db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins        if (!m_findOnPage.currentMatchIsInLayer())
1271db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins            scrollRectOnScreen(m_findOnPage.currentMatchBounds());
1272db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    }
12738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    viewInvalidate();
12748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1276afbc0998ef990403a8e17efb9a384a46707a328eLeon Scrogginsint currentMatchIndex()
1277afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins{
1278afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins    return m_findOnPage.currentMatchIndex();
1279afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins}
1280afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins
128151c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scrogginsbool scrollBy(int dx, int dy)
12828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
12848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
12863bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott    bool result = env->CallBooleanMethod(m_javaGlue.object(env).get(),
128751c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins        m_javaGlue.m_scrollBy, dx, dy, true);
12888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
128951c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins    return result;
12908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
129246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkbool hasCursorNode()
12938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedRoot* root = getFrameCache(DontAllowNewer);
12958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!root) {
12968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DBG_NAV_LOG("!root");
12978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
12988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
129946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedNode* cursorNode = root->currentCursor();
130046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    DBG_NAV_LOGD("cursorNode=%d (nodePointer=%p)",
130146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        cursorNode ? cursorNode->index() : -1,
130246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        cursorNode ? cursorNode->nodePointer() : 0);
130346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return cursorNode;
130446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
130546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
130646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkbool hasFocusNode()
130746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
130846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    CachedRoot* root = getFrameCache(DontAllowNewer);
130946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    if (!root) {
131046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        DBG_NAV_LOG("!root");
13118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
13128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
131346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedNode* focusNode = root->currentFocus();
131446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    DBG_NAV_LOGD("focusNode=%d (nodePointer=%p)",
131546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        focusNode ? focusNode->index() : -1,
131646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        focusNode ? focusNode->nodePointer() : 0);
131746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return focusNode;
13188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
132095fa6e99128685c55e9be6f4362e67c288482a74Leon Scrogginsvoid rebuildWebTextView()
13218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
13233bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott    env->CallVoidMethod(m_javaGlue.object(env).get(),
13243bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott            m_javaGlue.m_rebuildWebTextView);
13258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
13268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid viewInvalidate()
13298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
13313bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott    env->CallVoidMethod(m_javaGlue.object(env).get(), m_javaGlue.m_viewInvalidate);
13328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
13338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid viewInvalidateRect(int l, int t, int r, int b)
13368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
13383bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott    env->CallVoidMethod(m_javaGlue.object(env).get(), m_javaGlue.m_viewInvalidateRect, l, r, t, b);
13398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
13408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid postInvalidateDelayed(int64_t delay, const WebCore::IntRect& bounds)
13438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
13453bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott    env->CallVoidMethod(m_javaGlue.object(env).get(), m_javaGlue.m_postInvalidateDelayed,
13463bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott        delay, bounds.x(), bounds.y(), bounds.right(), bounds.bottom());
13478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
13488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13503deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenbergerbool inFullScreenMode()
13513deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger{
13523deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger    JNIEnv* env = JSC::Bindings::getJNIEnv();
13533deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger    jboolean result = env->CallBooleanMethod(m_javaGlue.object(env).get(),
13543deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger            m_javaGlue.m_inFullScreenMode);
13553deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger    checkException(env);
13563deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger    return result;
13573deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger}
13583deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger
135946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkint moveGeneration()
136046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
136146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return m_viewImpl->m_moveGeneration;
136246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
136346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
13646d43b9ceb777071c088fe12ee94af80e34816bcfGrace KlobaLayerAndroid* compositeRoot() const
1365f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{
13666d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    LOG_ASSERT(!m_baseLayer || m_baseLayer->countChildren() == 1,
13676d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba            "base layer can't have more than one child %s", __FUNCTION__);
13686d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (m_baseLayer && m_baseLayer->countChildren() == 1)
13696d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return static_cast<LayerAndroid*>(m_baseLayer->getChild(0));
13706d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    else
13716d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return 0;
1372f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark}
1373f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark
137482f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL)
1375a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scottstatic void copyScrollPositionRecursive(const LayerAndroid* from,
1376a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott                                        LayerAndroid* root)
1377a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{
1378a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    if (!from || !root)
1379a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        return;
1380a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    for (int i = 0; i < from->countChildren(); i++) {
1381a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        const LayerAndroid* l = from->getChild(i);
1382a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        if (l->contentIsScrollable()) {
138382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott            const SkPoint& pos = l->getPosition();
138482f247bdbb98dd80c44209d87692c650c3704617Patrick Scott            LayerAndroid* match = root->findById(l->uniqueId());
138582f247bdbb98dd80c44209d87692c650c3704617Patrick Scott            if (match && match->contentIsScrollable())
138682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott                match->setPosition(pos.fX, pos.fY);
1387a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        }
1388a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        copyScrollPositionRecursive(l, root);
1389a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    }
1390a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott}
139182f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif
1392a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott
139303d850006e8ce54945fe44c36ffaf074143184c5Teng-Hui Zhuvoid setBaseLayer(BaseLayerAndroid* layer, WebCore::IntRect& rect, bool showVisualIndicator)
1394f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{
1395a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
1396c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    if (m_glWebViewState)
139703d850006e8ce54945fe44c36ffaf074143184c5Teng-Hui Zhu        m_glWebViewState->setBaseLayer(layer, rect, showVisualIndicator);
1398a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
1399a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
140082f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL)
1401cf6e10e145f44cab3eb70f3782b51a92cf61ae7dShimeng (Simon) Wang    if (layer) {
140282f247bdbb98dd80c44209d87692c650c3704617Patrick Scott        LayerAndroid* newCompositeRoot = static_cast<LayerAndroid*>(layer->getChild(0));
140382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott        copyScrollPositionRecursive(compositeRoot(), newCompositeRoot);
1404cf6e10e145f44cab3eb70f3782b51a92cf61ae7dShimeng (Simon) Wang    }
140582f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif
1406b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger    SkSafeUnref(m_baseLayer);
14076d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    m_baseLayer = layer;
1408f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    CachedRoot* root = getFrameCache(DontAllowNewer);
1409f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    if (!root)
1410f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark        return;
1411f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    root->resetLayers();
14126d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    root->setRootLayer(compositeRoot());
14136d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
14146d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
14156d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobavoid replaceBaseContent(PictureSet* set)
14166d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
14176d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (!m_baseLayer)
14186d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return;
14196d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    m_baseLayer->setContent(*set);
14206d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    delete set;
14216d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
14226d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
14236d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobavoid copyBaseContentToPicture(SkPicture* picture)
14246d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
14256d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (!m_baseLayer)
14266d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return;
14276d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    PictureSet* content = m_baseLayer->content();
1428e59ed3e2c930c8eeed844aa0365e8285d956a8f2Nicolas Roard    m_baseLayer->drawCanvas(picture->beginRecording(content->width(), content->height(),
14296d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba            SkPicture::kUsePathBoundsForClip_RecordingFlag));
14306d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    picture->endRecording();
14316d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
14326d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
14336d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobabool hasContent() {
14346d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (!m_baseLayer)
14356d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return false;
14366d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    return !m_baseLayer->content()->isEmpty();
1437f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark}
1438f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark
1439908703e420f4931f74527aaeb3d5faabdd66c28aChet Haasevoid setFunctor(Functor* functor) {
1440908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    delete m_glDrawFunctor;
1441908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    m_glDrawFunctor = functor;
1442908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}
1443908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
1444908703e420f4931f74527aaeb3d5faabdd66c28aChet HaaseFunctor* getFunctor() {
1445908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    return m_glDrawFunctor;
1446908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}
1447908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
14488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate: // local state for WebView
14498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // private to getFrameCache(); other functions operate in a different thread
14508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedRoot* m_frameCacheUI; // navigation data ready for use
14518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebViewCore* m_viewImpl;
14528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int m_generation; // associate unique ID with sent kit focus to match with ui
14538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkPicture* m_navPictureUI;
14548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkMSec m_ringAnimationEnd;
14558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Corresponds to the same-named boolean on the java side.
14568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_heightCanMeasure;
14578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int m_lastDx;
14588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkMSec m_lastDxTime;
145987962ce00229855c098ba12cee8d5c015a835289Cary Clark    SelectText m_selectText;
1460f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    FindOnPage m_findOnPage;
146187962ce00229855c098ba12cee8d5c015a835289Cary Clark    CursorRing m_ring;
14626d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    BaseLayerAndroid* m_baseLayer;
1463908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    Functor* m_glDrawFunctor;
1464a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
1465c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    GLWebViewState* m_glWebViewState;
1466a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
14674de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins    const RenderSkinButton* m_buttonSkin;
14688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; // end of WebView class
14698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1470908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
1471908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase/**
1472908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * This class holds a function pointer and parameters for calling drawGL into a specific
1473908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * viewport. The pointer to the Functor will be put on a framework display list to be called
1474908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * when the display list is replayed.
1475908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase */
1476908703e420f4931f74527aaeb3d5faabdd66c28aChet Haaseclass GLDrawFunctor : Functor {
1477908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    public:
1478908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    GLDrawFunctor(WebView* _wvInstance,
1479908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase            bool(WebView::*_funcPtr)(WebCore::IntRect&, jfloat, jint),
1480908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase            WebCore::IntRect _viewRect, float _scale, int _extras) {
1481908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        wvInstance = _wvInstance;
1482908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        funcPtr = _funcPtr;
1483908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        viewRect = _viewRect;
1484908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        scale = _scale;
1485908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        extras = _extras;
1486908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    };
1487908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    status_t operator()() {
1488821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase        if (viewRect.isEmpty()) {
1489821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase            // NOOP operation if viewport is empty
1490821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase            return 0;
1491821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase        }
1492908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        bool retVal = (*wvInstance.*funcPtr)(viewRect, scale, extras);
1493908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        // return 1 if invalidation needed, 0 otherwise
1494908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        return retVal ? 1 : 0;
1495908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    }
1496908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    void updateRect(WebCore::IntRect& _viewRect) {
1497908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        viewRect = _viewRect;
1498908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    }
1499908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    private:
1500908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    WebView* wvInstance;
1501908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    bool (WebView::*funcPtr)(WebCore::IntRect&, float, int);
1502908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    WebCore::IntRect viewRect;
1503908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    jfloat scale;
1504908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    jint extras;
1505908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase};
1506908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
1507908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
1508908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
15098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
15108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Native JNI methods
15118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
1512d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkstatic int nativeCacheHitFramePointer(JNIEnv *env, jobject obj)
1513d4924af12855cd19162ba1442a6055664c98ca32Cary Clark{
1514d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    return reinterpret_cast<int>(GET_NATIVE_VIEW(env, obj)
1515d4924af12855cd19162ba1442a6055664c98ca32Cary Clark            ->m_cacheHitFrame->framePointer());
1516d4924af12855cd19162ba1442a6055664c98ca32Cary Clark}
1517d4924af12855cd19162ba1442a6055664c98ca32Cary Clark
1518d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkstatic jobject nativeCacheHitNodeBounds(JNIEnv *env, jobject obj)
1519d4924af12855cd19162ba1442a6055664c98ca32Cary Clark{
1520d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    WebCore::IntRect bounds = GET_NATIVE_VIEW(env, obj)
1521d4924af12855cd19162ba1442a6055664c98ca32Cary Clark        ->m_cacheHitNode->originalAbsoluteBounds();
1522d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    jclass rectClass = env->FindClass("android/graphics/Rect");
1523d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V");
1524d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    jobject rect = env->NewObject(rectClass, init, bounds.x(),
1525d4924af12855cd19162ba1442a6055664c98ca32Cary Clark        bounds.y(), bounds.right(), bounds.bottom());
1526bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(rectClass);
1527d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    return rect;
1528d4924af12855cd19162ba1442a6055664c98ca32Cary Clark}
1529d4924af12855cd19162ba1442a6055664c98ca32Cary Clark
1530d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkstatic int nativeCacheHitNodePointer(JNIEnv *env, jobject obj)
1531d4924af12855cd19162ba1442a6055664c98ca32Cary Clark{
1532d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    return reinterpret_cast<int>(GET_NATIVE_VIEW(env, obj)
1533d4924af12855cd19162ba1442a6055664c98ca32Cary Clark        ->m_cacheHitNode->nodePointer());
1534d4924af12855cd19162ba1442a6055664c98ca32Cary Clark}
1535d4924af12855cd19162ba1442a6055664c98ca32Cary Clark
1536b57c3a124715a89ac026e86f4fd3890529525d11Cary Clarkstatic bool nativeCacheHitIsPlugin(JNIEnv *env, jobject obj)
1537b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark{
1538b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark    return GET_NATIVE_VIEW(env, obj)->m_cacheHitNode->isPlugin();
1539b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark}
1540b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark
1541c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clarkstatic void nativeClearCursor(JNIEnv *env, jobject obj)
15428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
15438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
15448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
1545c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    view->clearCursor();
15468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
15478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15484de82d04a6a82fee6e2d924768e88af58e966982Leon Scrogginsstatic void nativeCreate(JNIEnv *env, jobject obj, int viewImpl, jstring drawableDir,
15494de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins                         jobject jAssetManager)
15508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
15514de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins    AssetManager* am = assetManagerForJavaObject(env, jAssetManager);
15524de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins    WTF::String dir = jstringToWtfString(env, drawableDir);
15534de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins    WebView* webview = new WebView(env, obj, viewImpl, dir, am);
15548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // NEED THIS OR SOMETHING LIKE IT!
15558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //Release(obj);
15568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
15578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
155846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jint nativeCursorFramePointer(JNIEnv *env, jobject obj)
155946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
156046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
156146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
156246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    if (!root)
156346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        return 0;
156446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedFrame* frame = 0;
156546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    (void) root->currentCursor(&frame);
156646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return reinterpret_cast<int>(frame ? frame->framePointer() : 0);
156746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
156846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
156946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic const CachedNode* getCursorNode(JNIEnv *env, jobject obj)
157046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
157146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
157246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
157346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return root ? root->currentCursor() : 0;
157446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
157546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
15761d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clarkstatic const CachedNode* getCursorNode(JNIEnv *env, jobject obj,
15771d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    const CachedFrame** frame)
15781d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark{
15791d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
15801d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
15811d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    return root ? root->currentCursor(frame) : 0;
15821d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark}
15831d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark
1584f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clarkstatic const CachedNode* getFocusCandidate(JNIEnv *env, jobject obj,
1585f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedFrame** frame)
1586f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark{
1587f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
1588f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
1589f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark    if (!root)
1590f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark        return 0;
1591f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedNode* cursor = root->currentCursor(frame);
1592f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark    if (cursor && cursor->wantsKeyEvents())
1593f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark        return cursor;
15944ca469897f8dc36063e262faccefe4b8eacb9e7bCary Clark    return root->currentFocus(frame);
1595f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark}
1596f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark
15972194b17e89b2ad4c0624f7612e417db6d69150adLeon Scrogginsstatic bool focusCandidateHasNextTextfield(JNIEnv *env, jobject obj)
15982194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins{
159965966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
160065966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
160165966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    if (!root)
160265966ae193adfef8d40419ad9c11515b0e56f257Cary Clark        return false;
160365966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    const CachedNode* cursor = root->currentCursor();
160465966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    if (!cursor || !cursor->isTextInput())
160565966ae193adfef8d40419ad9c11515b0e56f257Cary Clark        cursor = root->currentFocus();
16062194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins    if (!cursor || !cursor->isTextInput()) return false;
160765966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    return root->nextTextField(cursor, 0);
16082194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins}
16092194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins
161046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic const CachedNode* getFocusNode(JNIEnv *env, jobject obj)
161146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
161246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
161346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
161446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return root ? root->currentFocus() : 0;
161546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
161646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
16178026280044128436d8e89736519a0b32b6540201Cary Clarkstatic const CachedNode* getFocusNode(JNIEnv *env, jobject obj,
16188026280044128436d8e89736519a0b32b6540201Cary Clark    const CachedFrame** frame)
16198026280044128436d8e89736519a0b32b6540201Cary Clark{
16208026280044128436d8e89736519a0b32b6540201Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
16218026280044128436d8e89736519a0b32b6540201Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
16228026280044128436d8e89736519a0b32b6540201Cary Clark    return root ? root->currentFocus(frame) : 0;
16238026280044128436d8e89736519a0b32b6540201Cary Clark}
16248026280044128436d8e89736519a0b32b6540201Cary Clark
16251d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clarkstatic const CachedInput* getInputCandidate(JNIEnv *env, jobject obj)
16261d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark{
16271d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
16281d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
16291d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    if (!root)
16301d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark        return 0;
16311d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    const CachedFrame* frame;
16321d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    const CachedNode* cursor = root->currentCursor(&frame);
16331d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    if (!cursor || !cursor->wantsKeyEvents())
16341d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark        cursor = root->currentFocus(&frame);
16351d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    return cursor ? frame->textInput(cursor) : 0;
16361d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark}
16371d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark
16381cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scrogginsstatic jboolean nativePageShouldHandleShiftAndArrows(JNIEnv *env, jobject obj)
16391cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins{
16401cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    const CachedNode* focus = getFocusNode(env, obj);
16411cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    if (!focus) return false;
16421cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    // Plugins handle shift and arrows whether or not they have focus.
16431cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    if (focus->isPlugin()) return true;
16441cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    const CachedNode* cursor = getCursorNode(env, obj);
16451cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    // ContentEditable nodes should only receive shift and arrows if they have
16461cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    // both the cursor and the focus.
16471cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    return cursor && cursor->nodePointer() == focus->nodePointer()
16481cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins            && cursor->isContentEditable();
16491cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins}
16501cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins
165146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jobject nativeCursorNodeBounds(JNIEnv *env, jobject obj)
165246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
1653f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedFrame* frame;
1654f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedNode* node = getCursorNode(env, obj, &frame);
1655f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    WebCore::IntRect bounds = node ? node->bounds(frame)
165646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        : WebCore::IntRect(0, 0, 0, 0);
165746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    jclass rectClass = env->FindClass("android/graphics/Rect");
165846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V");
165946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    jobject rect = env->NewObject(rectClass, init, bounds.x(),
166046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        bounds.y(), bounds.right(), bounds.bottom());
1661bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(rectClass);
166246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return rect;
166346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
166446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
166546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jint nativeCursorNodePointer(JNIEnv *env, jobject obj)
166646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
166746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedNode* node = getCursorNode(env, obj);
166846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return reinterpret_cast<int>(node ? node->nodePointer() : 0);
166946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
167046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
167136747fa778285f57f2f53c047028be83e9d8776dCary Clarkstatic jobject nativeCursorPosition(JNIEnv *env, jobject obj)
167236747fa778285f57f2f53c047028be83e9d8776dCary Clark{
167336747fa778285f57f2f53c047028be83e9d8776dCary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
16740181faa1ffede024c2712df19ae7c855a8cf64e3Cary Clark    const CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
167536747fa778285f57f2f53c047028be83e9d8776dCary Clark    WebCore::IntPoint pos = WebCore::IntPoint(0, 0);
167636747fa778285f57f2f53c047028be83e9d8776dCary Clark    if (root)
167719194ea29920c2f7a02d08dfb0416608bc81dbb7Leon Scroggins        root->getSimulatedMousePosition(&pos);
167836747fa778285f57f2f53c047028be83e9d8776dCary Clark    jclass pointClass = env->FindClass("android/graphics/Point");
167936747fa778285f57f2f53c047028be83e9d8776dCary Clark    jmethodID init = env->GetMethodID(pointClass, "<init>", "(II)V");
168036747fa778285f57f2f53c047028be83e9d8776dCary Clark    jobject point = env->NewObject(pointClass, init, pos.x(), pos.y());
1681bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(pointClass);
168236747fa778285f57f2f53c047028be83e9d8776dCary Clark    return point;
168336747fa778285f57f2f53c047028be83e9d8776dCary Clark}
168436747fa778285f57f2f53c047028be83e9d8776dCary Clark
168546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic WebCore::IntRect jrect_to_webrect(JNIEnv* env, jobject obj)
168646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
168746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    int L, T, R, B;
168846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    GraphicsJNI::get_jrect(env, obj, &L, &T, &R, &B);
168946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return WebCore::IntRect(L, T, R - L, B - T);
169046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
169146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
169246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic bool nativeCursorIntersects(JNIEnv *env, jobject obj, jobject visRect)
169346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
1694f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedFrame* frame;
1695f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedNode* node = getCursorNode(env, obj, &frame);
1696f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    return node ? node->bounds(frame).intersects(
1697f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark        jrect_to_webrect(env, visRect)) : false;
169846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
169946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
170046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic bool nativeCursorIsAnchor(JNIEnv *env, jobject obj)
170146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
170246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedNode* node = getCursorNode(env, obj);
170346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return node ? node->isAnchor() : false;
170446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
170546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
170646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic bool nativeCursorIsTextInput(JNIEnv *env, jobject obj)
170746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
170846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedNode* node = getCursorNode(env, obj);
17091d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    return node ? node->isTextInput() : false;
171046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
171146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
171246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jobject nativeCursorText(JNIEnv *env, jobject obj)
171346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
171446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedNode* node = getCursorNode(env, obj);
171546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    if (!node)
171646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        return 0;
171745b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch    WTF::String value = node->getExport();
171879b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block    return wtfStringToJstring(env, value);
171946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
172046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
17218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeDebugDump(JNIEnv *env, jobject obj)
17228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
17238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if DUMP_NAV_CACHE
17248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
17258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
17268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    view->debugDump();
17278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
17288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
17298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17306d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic jint nativeDraw(JNIEnv *env, jobject obj, jobject canv, jint color,
17316d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        jint extras, jboolean split) {
17328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkCanvas* canvas = GraphicsJNI::getNativeCanvas(env, canv);
17336d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    return reinterpret_cast<jint>(GET_NATIVE_VIEW(env, obj)->draw(canvas, color, extras, split));
17348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
17358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1736908703e420f4931f74527aaeb3d5faabdd66c28aChet Haasestatic jint nativeGetDrawGLFunction(JNIEnv *env, jobject obj, jobject jrect,
1737908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        jfloat scale, jint extras) {
1738821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase    WebCore::IntRect viewRect;
1739821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase    if (jrect == NULL) {
1740821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase        viewRect = WebCore::IntRect();
1741821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase    } else {
1742821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase        viewRect = jrect_to_webrect(env, jrect);
1743821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase    }
1744908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    WebView *wvInstance = GET_NATIVE_VIEW(env, obj);
1745908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    GLDrawFunctor* functor = new GLDrawFunctor(wvInstance, &android::WebView::drawGL,
1746908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase            viewRect, scale, extras);
1747908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    wvInstance->setFunctor((Functor*) functor);
1748908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    return (jint)functor;
1749908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}
1750908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
1751908703e420f4931f74527aaeb3d5faabdd66c28aChet Haasestatic void nativeUpdateDrawGLFunction(JNIEnv *env, jobject obj, jobject jrect) {
1752908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    WebView *wvInstance = GET_NATIVE_VIEW(env, obj);
1753908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    if (wvInstance != NULL) {
1754908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        GLDrawFunctor* functor = (GLDrawFunctor*) wvInstance->getFunctor();
1755908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        if (functor != NULL) {
1756821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase            WebCore::IntRect viewRect;
1757821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase            if (jrect == NULL) {
1758821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase                viewRect = WebCore::IntRect();
1759821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase            } else {
1760821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase                viewRect = jrect_to_webrect(env, jrect);
1761821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase            }
1762908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase            functor->updateRect(viewRect);
1763908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        }
1764908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    }
1765908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}
1766908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
1767a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardstatic bool nativeDrawGL(JNIEnv *env, jobject obj, jobject jrect,
1768a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard                         jfloat scale, jint extras)
1769a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
1770a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    WebCore::IntRect viewRect = jrect_to_webrect(env, jrect);
1771a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    return GET_NATIVE_VIEW(env, obj)->drawGL(viewRect, scale, extras);
1772a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
1773a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
177487962ce00229855c098ba12cee8d5c015a835289Cary Clarkstatic bool nativeEvaluateLayersAnimations(JNIEnv *env, jobject obj)
1775797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{
1776797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#if USE(ACCELERATED_COMPOSITING)
17776d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    const LayerAndroid* root = GET_NATIVE_VIEW(env, obj)->compositeRoot();
177887962ce00229855c098ba12cee8d5c015a835289Cary Clark    if (root)
177987962ce00229855c098ba12cee8d5c015a835289Cary Clark        return root->evaluateAnimations();
1780797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#endif
1781797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard    return false;
1782797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard}
1783797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard
178403d850006e8ce54945fe44c36ffaf074143184c5Teng-Hui Zhustatic void nativeSetBaseLayer(JNIEnv *env, jobject obj, jint layer, jobject jrect,
178503d850006e8ce54945fe44c36ffaf074143184c5Teng-Hui Zhu                                jboolean showVisualIndicator)
1786f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{
17876d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    BaseLayerAndroid* layerImpl = reinterpret_cast<BaseLayerAndroid*>(layer);
1788a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    WebCore::IntRect rect = jrect_to_webrect(env, jrect);
178903d850006e8ce54945fe44c36ffaf074143184c5Teng-Hui Zhu    GET_NATIVE_VIEW(env, obj)->setBaseLayer(layerImpl, rect, showVisualIndicator);
17906d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
17916d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
17926d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic void nativeReplaceBaseContent(JNIEnv *env, jobject obj, jint content)
17936d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
17946d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    PictureSet* set = reinterpret_cast<PictureSet*>(content);
17956d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    GET_NATIVE_VIEW(env, obj)->replaceBaseContent(set);
17966d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
17976d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
17986d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic void nativeCopyBaseContentToPicture(JNIEnv *env, jobject obj, jobject pict)
17996d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
18006d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    SkPicture* picture = GraphicsJNI::getNativePicture(env, pict);
18016d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    GET_NATIVE_VIEW(env, obj)->copyBaseContentToPicture(picture);
18026d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
18036d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
18046d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic bool nativeHasContent(JNIEnv *env, jobject obj)
18056d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
18066d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    return GET_NATIVE_VIEW(env, obj)->hasContent();
1807f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark}
1808f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark
18098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jobject nativeImageURI(JNIEnv *env, jobject obj, jint x, jint y)
18108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
18118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
18128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
181345b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch    WTF::String uri = view->imageURI(x, y);
181479b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block    return wtfStringToJstring(env, uri);
18158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
18168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
181749e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clarkstatic jint nativeFocusCandidateFramePointer(JNIEnv *env, jobject obj)
181849e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark{
181949e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
182049e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
182149e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark    if (!root)
182249e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark        return 0;
182349e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark    const CachedFrame* frame = 0;
182449e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark    const CachedNode* cursor = root->currentCursor(&frame);
182549e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark    if (!cursor || !cursor->wantsKeyEvents())
182649e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark        (void) root->currentFocus(&frame);
182749e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark    return reinterpret_cast<int>(frame ? frame->framePointer() : 0);
182849e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark}
182949e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark
1830bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic bool nativeFocusCandidateIsPassword(JNIEnv *env, jobject obj)
183146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
18321d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    const CachedInput* input = getInputCandidate(env, obj);
1833737a377f81baa2bf868b48f3457cc9a53cea2e6eBen Murdoch    return input && input->getType() == CachedInput::PASSWORD;
183446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
183546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
1836bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic bool nativeFocusCandidateIsRtlText(JNIEnv *env, jobject obj)
183746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
18381d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    const CachedInput* input = getInputCandidate(env, obj);
18391d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    return input ? input->isRtlText() : false;
184046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
184146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
1842bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic bool nativeFocusCandidateIsTextInput(JNIEnv *env, jobject obj)
184346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
1844f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedNode* node = getFocusCandidate(env, obj, 0);
18451d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    return node ? node->isTextInput() : false;
184646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
184746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
1848bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic jint nativeFocusCandidateMaxLength(JNIEnv *env, jobject obj)
184946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
18501d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    const CachedInput* input = getInputCandidate(env, obj);
18511d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    return input ? input->maxLength() : false;
185246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
185346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
1854ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scrogginsstatic jint nativeFocusCandidateIsAutoComplete(JNIEnv *env, jobject obj)
1855ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins{
1856ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins    const CachedInput* input = getInputCandidate(env, obj);
1857ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins    return input ? input->autoComplete() : false;
1858ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins}
1859ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins
1860bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic jobject nativeFocusCandidateName(JNIEnv *env, jobject obj)
186146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
18621d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    const CachedInput* input = getInputCandidate(env, obj);
18631d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    if (!input)
186446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        return 0;
186545b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch    const WTF::String& name = input->name();
186679b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block    return wtfStringToJstring(env, name);
186746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
186846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
1869390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scrogginsstatic jobject createJavaRect(JNIEnv* env, int x, int y, int right, int bottom)
1870390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins{
1871390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    jclass rectClass = env->FindClass("android/graphics/Rect");
1872390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V");
1873390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    jobject rect = env->NewObject(rectClass, init, x, y, right, bottom);
1874bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(rectClass);
1875390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    return rect;
1876390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins}
1877390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins
1878bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic jobject nativeFocusCandidateNodeBounds(JNIEnv *env, jobject obj)
187946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
1880f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedFrame* frame;
1881f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedNode* node = getFocusCandidate(env, obj, &frame);
1882f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    WebCore::IntRect bounds = node ? node->bounds(frame)
188346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        : WebCore::IntRect(0, 0, 0, 0);
1884390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    return createJavaRect(env, bounds.x(), bounds.y(), bounds.right(), bounds.bottom());
1885390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins}
1886390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins
1887390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scrogginsstatic jobject nativeFocusCandidatePaddingRect(JNIEnv *env, jobject obj)
1888390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins{
1889390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    const CachedInput* input = getInputCandidate(env, obj);
1890390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    if (!input)
1891390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins        return 0;
1892390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    // Note that the Java Rect is being used to pass four integers, rather than
1893390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    // being used as an actual rectangle.
1894390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    return createJavaRect(env, input->paddingLeft(), input->paddingTop(),
1895390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins            input->paddingRight(), input->paddingBottom());
189646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
189746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
1898bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic jint nativeFocusCandidatePointer(JNIEnv *env, jobject obj)
189946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
1900f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedNode* node = getFocusCandidate(env, obj, 0);
190146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return reinterpret_cast<int>(node ? node->nodePointer() : 0);
190246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
190346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
1904bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic jobject nativeFocusCandidateText(JNIEnv *env, jobject obj)
190546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
1906f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedNode* node = getFocusCandidate(env, obj, 0);
190746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    if (!node)
190846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        return 0;
190945b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch    WTF::String value = node->getExport();
191079b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block    return wtfStringToJstring(env, value);
191146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
191246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
1913d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scrogginsstatic int nativeFocusCandidateLineHeight(JNIEnv *env, jobject obj)
1914d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins{
1915d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins    const CachedInput* input = getInputCandidate(env, obj);
1916d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins    return input ? input->lineHeight() : 0;
1917d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins}
1918d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins
19193a3b28707d2d6a06afe9f3137e9bedc07246d600Leon Scrogginsstatic jfloat nativeFocusCandidateTextSize(JNIEnv *env, jobject obj)
192046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
19211d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    const CachedInput* input = getInputCandidate(env, obj);
19223a3b28707d2d6a06afe9f3137e9bedc07246d600Leon Scroggins    return input ? input->textSize() : 0.f;
192346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
192446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
192574757b62fce144f27c25cc7744df82cd7411b2dcLeon Scrogginsstatic int nativeFocusCandidateType(JNIEnv *env, jobject obj)
192674757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins{
192774757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins    const CachedInput* input = getInputCandidate(env, obj);
192841c8cd06bd25769654e321d1222856182ebad067Ben Murdoch    if (!input)
1929737a377f81baa2bf868b48f3457cc9a53cea2e6eBen Murdoch        return CachedInput::NONE;
193041c8cd06bd25769654e321d1222856182ebad067Ben Murdoch
193141c8cd06bd25769654e321d1222856182ebad067Ben Murdoch    if (input->isTextArea())
1932737a377f81baa2bf868b48f3457cc9a53cea2e6eBen Murdoch        return CachedInput::TEXT_AREA;
1933737a377f81baa2bf868b48f3457cc9a53cea2e6eBen Murdoch
1934737a377f81baa2bf868b48f3457cc9a53cea2e6eBen Murdoch    return input->getType();
193574757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins}
193674757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins
1937c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenbergerstatic bool nativeFocusIsPlugin(JNIEnv *env, jobject obj)
1938c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger{
1939c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger    const CachedNode* node = getFocusNode(env, obj);
1940c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger    return node ? node->isPlugin() : false;
1941c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger}
1942c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger
19438026280044128436d8e89736519a0b32b6540201Cary Clarkstatic jobject nativeFocusNodeBounds(JNIEnv *env, jobject obj)
19448026280044128436d8e89736519a0b32b6540201Cary Clark{
19458026280044128436d8e89736519a0b32b6540201Cary Clark    const CachedFrame* frame;
19468026280044128436d8e89736519a0b32b6540201Cary Clark    const CachedNode* node = getFocusNode(env, obj, &frame);
19478026280044128436d8e89736519a0b32b6540201Cary Clark    WebCore::IntRect bounds = node ? node->bounds(frame)
19488026280044128436d8e89736519a0b32b6540201Cary Clark        : WebCore::IntRect(0, 0, 0, 0);
19498026280044128436d8e89736519a0b32b6540201Cary Clark    jclass rectClass = env->FindClass("android/graphics/Rect");
19508026280044128436d8e89736519a0b32b6540201Cary Clark    jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V");
19518026280044128436d8e89736519a0b32b6540201Cary Clark    jobject rect = env->NewObject(rectClass, init, bounds.x(),
19528026280044128436d8e89736519a0b32b6540201Cary Clark        bounds.y(), bounds.right(), bounds.bottom());
1953bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(rectClass);
19548026280044128436d8e89736519a0b32b6540201Cary Clark    return rect;
19558026280044128436d8e89736519a0b32b6540201Cary Clark}
19568026280044128436d8e89736519a0b32b6540201Cary Clark
1957539427bc7572dfd8b28579c67460186406dcb246Leon Scrogginsstatic jint nativeFocusNodePointer(JNIEnv *env, jobject obj)
1958539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins{
1959539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins    const CachedNode* node = getFocusNode(env, obj);
1960539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins    return node ? reinterpret_cast<int>(node->nodePointer()) : 0;
1961539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins}
1962539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins
1963f4669cac3858848a9247e801b6106aeae6d406e8Cary Clarkstatic bool nativeCursorWantsKeyEvents(JNIEnv* env, jobject jwebview) {
19648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, jwebview);
19658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
1966f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark    return view->cursorWantsKeyEvents();
19678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
19688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1969c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clarkstatic void nativeHideCursor(JNIEnv *env, jobject obj)
1970c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark{
1971c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
1972c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
1973c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    view->hideCursor();
1974c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark}
1975c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark
19768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeInstrumentReport(JNIEnv *env, jobject obj)
19778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
19788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_INSTRUMENT
19798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    TimeCounter::reportNow();
19808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
19818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
19828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeSelectBestAt(JNIEnv *env, jobject obj, jobject jrect)
19848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
19858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
19868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
19878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::IntRect rect = jrect_to_webrect(env, jrect);
19888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    view->selectBestAt(rect);
19898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
19908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19911b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganovstatic void nativeSelectAt(JNIEnv *env, jobject obj, jint x, jint y)
19921b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov{
19931b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov    WebView* view = GET_NATIVE_VIEW(env, obj);
19941b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
19951b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov    WebCore::IntRect rect = IntRect(x, y , 1, 1);
19961b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov    view->selectBestAt(rect);
19971b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov    if (view->hasCursorNode())
19981b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov        view->showCursorUntimed();
19991b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov}
20001b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov
20019092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clarkstatic jobject nativeLayerBounds(JNIEnv* env, jobject obj, jint jlayer)
20029092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark{
20039092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    SkRect r;
20049092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark#if USE(ACCELERATED_COMPOSITING)
20059092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    LayerAndroid* layer = (LayerAndroid*) jlayer;
20069092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    r = layer->bounds();
20079092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark#else
20089092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    r.setEmpty();
20099092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark#endif
20109092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    SkIRect irect;
20119092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    r.round(&irect);
20129092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    jclass rectClass = env->FindClass("android/graphics/Rect");
20139092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V");
20149092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    jobject rect = env->NewObject(rectClass, init, irect.fLeft, irect.fTop,
20159092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark        irect.fRight, irect.fBottom);
20169092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    env->DeleteLocalRef(rectClass);
20179092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    return rect;
20189092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark}
20199092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark
2020cc4e3c422964c7d999e8f340057f303140d845ddCary Clarkstatic jobject nativeSubtractLayers(JNIEnv* env, jobject obj, jobject jrect)
2021cc4e3c422964c7d999e8f340057f303140d845ddCary Clark{
2022cc4e3c422964c7d999e8f340057f303140d845ddCary Clark    SkIRect irect = jrect_to_webrect(env, jrect);
2023cc4e3c422964c7d999e8f340057f303140d845ddCary Clark#if USE(ACCELERATED_COMPOSITING)
20246d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    LayerAndroid* root = GET_NATIVE_VIEW(env, obj)->compositeRoot();
2025cc4e3c422964c7d999e8f340057f303140d845ddCary Clark    if (root) {
2026cc4e3c422964c7d999e8f340057f303140d845ddCary Clark        SkRect rect;
2027cc4e3c422964c7d999e8f340057f303140d845ddCary Clark        rect.set(irect);
2028cc4e3c422964c7d999e8f340057f303140d845ddCary Clark        rect = root->subtractLayers(rect);
2029cc4e3c422964c7d999e8f340057f303140d845ddCary Clark        rect.round(&irect);
2030cc4e3c422964c7d999e8f340057f303140d845ddCary Clark    }
2031cc4e3c422964c7d999e8f340057f303140d845ddCary Clark#endif
2032cc4e3c422964c7d999e8f340057f303140d845ddCary Clark    jclass rectClass = env->FindClass("android/graphics/Rect");
2033cc4e3c422964c7d999e8f340057f303140d845ddCary Clark    jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V");
2034bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    jobject rect = env->NewObject(rectClass, init, irect.fLeft, irect.fTop,
2035cc4e3c422964c7d999e8f340057f303140d845ddCary Clark        irect.fRight, irect.fBottom);
2036bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(rectClass);
2037bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    return rect;
2038cc4e3c422964c7d999e8f340057f303140d845ddCary Clark}
2039cc4e3c422964c7d999e8f340057f303140d845ddCary Clark
204046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jint nativeTextGeneration(JNIEnv *env, jobject obj)
204146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
204246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
204346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
204446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return root ? root->textGeneration() : 0;
204546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
204646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
2047d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkstatic bool nativePointInNavCache(JNIEnv *env, jobject obj,
2048d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    int x, int y, int slop)
2049d4924af12855cd19162ba1442a6055664c98ca32Cary Clark{
2050d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    return GET_NATIVE_VIEW(env, obj)->pointInNavCache(x, y, slop);
2051d4924af12855cd19162ba1442a6055664c98ca32Cary Clark}
2052d4924af12855cd19162ba1442a6055664c98ca32Cary Clark
20538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool nativeMotionUp(JNIEnv *env, jobject obj,
2054d48434fc633d173b549b97b1c614072adc9648a8Cary Clark    int x, int y, int slop)
20558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
20568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
20578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
205846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return view->motionUp(x, y, slop);
20598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
20608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
206146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic bool nativeHasCursorNode(JNIEnv *env, jobject obj)
20628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
206346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return GET_NATIVE_VIEW(env, obj)->hasCursorNode();
20648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
20658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
206646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic bool nativeHasFocusNode(JNIEnv *env, jobject obj)
20678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
206846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return GET_NATIVE_VIEW(env, obj)->hasFocusNode();
20698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
20708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2071bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic bool nativeMoveCursor(JNIEnv *env, jobject obj,
207246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    int key, int count, bool ignoreScroll)
20738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
20748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
207546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    DBG_NAV_LOGD("env=%p obj=%p view=%p", env, obj, view);
20768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
20774ca8bc94f71466d1109bfbb9ef00da3256a0899bCary Clark    return view->moveCursor(key, count, ignoreScroll);
20788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
20798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeRecordButtons(JNIEnv* env, jobject obj, bool hasFocus,
20818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool pressed, bool invalidate)
20828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
20838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
20848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
20858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    view->nativeRecordButtons(hasFocus, pressed, invalidate);
20868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
20878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2088afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clarkstatic void nativeSetFindIsUp(JNIEnv *env, jobject obj, jboolean isUp)
20898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
20908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
20918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
2092afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    view->setFindIsUp(isUp);
2093afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark}
2094afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark
2095afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clarkstatic void nativeSetFindIsEmpty(JNIEnv *env, jobject obj)
2096afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark{
2097afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    GET_NATIVE_VIEW(env, obj)->setFindIsEmpty();
20988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
20998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
210032dffb883f56b18019afa7a01b2564b993b3fe8eCary Clarkstatic void nativeShowCursorTimed(JNIEnv *env, jobject obj)
21018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
210232dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    GET_NATIVE_VIEW(env, obj)->showCursorTimed();
21038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeSetHeightCanMeasure(JNIEnv *env, jobject obj, bool measure)
21068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
21088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in nativeSetHeightCanMeasure");
21098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    view->setHeightCanMeasure(measure);
21108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
211246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jobject nativeGetCursorRingBounds(JNIEnv *env, jobject obj)
21138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
21158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
21168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jclass rectClass = env->FindClass("android/graphics/Rect");
21178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(rectClass, "Could not find Rect class!");
21188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V");
21198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(init, "Could not find constructor for Rect");
21208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::IntRect webRect;
212146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    view->cursorRingBounds(&webRect);
21228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jobject rect = env->NewObject(rectClass, init, webRect.x(),
21238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        webRect.y(), webRect.right(), webRect.bottom());
2124bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(rectClass);
21258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return rect;
21268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic int nativeFindAll(JNIEnv *env, jobject obj, jstring findLower,
2129db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins        jstring findUpper, jboolean sameAsLastSearch)
21308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If one or the other is null, do not search.
21328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!(findLower && findUpper))
21338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
21348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Obtain the characters for both the lower case string and the upper case
21358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // string representing the same word.
21368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const jchar* findLowerChars = env->GetStringChars(findLower, 0);
21378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const jchar* findUpperChars = env->GetStringChars(findUpper, 0);
21388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If one or the other is null, do not search.
21398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!(findLowerChars && findUpperChars)) {
21408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (findLowerChars)
21418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            env->ReleaseStringChars(findLower, findLowerChars);
21428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (findUpperChars)
21438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            env->ReleaseStringChars(findUpper, findUpperChars);
21448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        checkException(env);
21458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
21468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
21478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
21488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in nativeFindAll");
214946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    CachedRoot* root = view->getFrameCache(WebView::AllowNewer);
21508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!root) {
21518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        env->ReleaseStringChars(findLower, findLowerChars);
21528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        env->ReleaseStringChars(findUpper, findUpperChars);
21538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        checkException(env);
21548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
21558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
21568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int length = env->GetStringLength(findLower);
21578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If the lengths of the strings do not match, then they are not the same
21588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // word, so do not search.
21598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!length || env->GetStringLength(findUpper) != length) {
21608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        env->ReleaseStringChars(findLower, findLowerChars);
21618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        env->ReleaseStringChars(findUpper, findUpperChars);
21628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        checkException(env);
21638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
21648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
21658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int width = root->documentWidth();
21668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int height = root->documentHeight();
21678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Create a FindCanvas, which allows us to fake draw into it so we can
21688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // figure out where our search string is rendered (and how many times).
21698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FindCanvas canvas(width, height, (const UChar*) findLowerChars,
21708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            (const UChar*) findUpperChars, length << 1);
21718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkBitmap bitmap;
21728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bitmap.setConfig(SkBitmap::kARGB_8888_Config, width, height);
21738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    canvas.setBitmapDevice(bitmap);
2174f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    root->draw(canvas);
21758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WTF::Vector<MatchInfo>* matches = canvas.detachMatches();
21768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // With setMatches, the WebView takes ownership of matches
2177db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    view->setMatches(matches, sameAsLastSearch);
21788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    env->ReleaseStringChars(findLower, findLowerChars);
21808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    env->ReleaseStringChars(findUpper, findUpperChars);
21818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
21828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return canvas.found();
21838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeFindNext(JNIEnv *env, jobject obj, bool forward)
21868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
21888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in nativeFindNext");
21898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    view->findNext(forward);
21908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2192afbc0998ef990403a8e17efb9a384a46707a328eLeon Scrogginsstatic int nativeFindIndex(JNIEnv *env, jobject obj)
2193afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins{
2194afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins    WebView* view = GET_NATIVE_VIEW(env, obj);
2195afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins    LOG_ASSERT(view, "view not set in nativeFindIndex");
2196afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins    return view->currentMatchIndex();
2197afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins}
2198afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins
21998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeUpdateCachedTextfield(JNIEnv *env, jobject obj, jstring updatedText, jint generation)
22008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
22028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in nativeUpdateCachedTextfield");
22038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
22048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!root)
22058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
22068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CachedNode* cachedFocusNode = root->currentFocus();
22071d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    if (!cachedFocusNode || !cachedFocusNode->isTextInput())
22088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
220927dd31673790eed64c3e0e508bb900671f06bcb3Steve Block    WTF::String webcoreString = jstringToWtfString(env, updatedText);
22108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    (const_cast<CachedNode*>(cachedFocusNode))->setExport(webcoreString);
22118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    root->setTextGeneration(generation);
22128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
22138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2215fa768f11d82c34980cce020f442329299efb08caCary Clarkstatic jint nativeGetBlockLeftEdge(JNIEnv *env, jobject obj, jint x, jint y,
2216fa768f11d82c34980cce020f442329299efb08caCary Clark        jfloat scale)
2217a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba{
2218a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba    WebView* view = GET_NATIVE_VIEW(env, obj);
2219a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
2220a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba    if (!view)
2221a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba        return -1;
2222fa768f11d82c34980cce020f442329299efb08caCary Clark    return view->getBlockLeftEdge(x, y, scale);
2223a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba}
2224a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba
22258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeDestroy(JNIEnv *env, jobject obj)
22268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
22288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOGD("nativeDestroy view: %p", view);
22298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in nativeDestroy");
22308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete view;
22318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22338360bc9c9facd690e42379610cbbb368d3d705efCary Clarkstatic void nativeStopGL(JNIEnv *env, jobject obj)
22348360bc9c9facd690e42379610cbbb368d3d705efCary Clark{
22358360bc9c9facd690e42379610cbbb368d3d705efCary Clark    GET_NATIVE_VIEW(env, obj)->stopGL();
22368360bc9c9facd690e42379610cbbb368d3d705efCary Clark}
22378360bc9c9facd690e42379610cbbb368d3d705efCary Clark
22388480ea3097f295aeccf7c088a06cceea543238b7Leon Scrogginsstatic bool nativeMoveCursorToNextTextInput(JNIEnv *env, jobject obj)
2239e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins{
2240e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins    WebView* view = GET_NATIVE_VIEW(env, obj);
2241e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
2242e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins    if (!root)
22438480ea3097f295aeccf7c088a06cceea543238b7Leon Scroggins        return false;
224465966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    const CachedNode* current = root->currentCursor();
224565966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    if (!current || !current->isTextInput())
224665966ae193adfef8d40419ad9c11515b0e56f257Cary Clark        current = root->currentFocus();
224765966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    if (!current || !current->isTextInput())
22488480ea3097f295aeccf7c088a06cceea543238b7Leon Scroggins        return false;
2249e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins    const CachedFrame* frame;
225065966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    const CachedNode* next = root->nextTextField(current, &frame);
2251e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins    if (!next)
22528480ea3097f295aeccf7c088a06cceea543238b7Leon Scroggins        return false;
2253f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const WebCore::IntRect& bounds = next->bounds(frame);
2254b0c9a2b4033eca931163e8223d7eaa8889337144Patrick Scott    root->rootHistory()->setMouseBounds(bounds);
225587962ce00229855c098ba12cee8d5c015a835289Cary Clark    view->getWebViewCore()->updateCursorBounds(root, frame, next);
225632dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    view->showCursorUntimed();
2257e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins    root->setCursor(const_cast<CachedFrame*>(frame),
2258e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins            const_cast<CachedNode*>(next));
2259bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins    view->sendMoveFocus(static_cast<WebCore::Frame*>(frame->framePointer()),
2260bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins            static_cast<WebCore::Node*>(next->nodePointer()));
22615065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    if (!next->isInLayer())
22625065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark        view->scrollRectOnScreen(bounds);
2263f74580c1504dcdd43fd15995b0e137982512dba2Leon Scroggins    view->getWebViewCore()->m_moveGeneration++;
22648480ea3097f295aeccf7c088a06cceea543238b7Leon Scroggins    return true;
2265e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins}
2266e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins
226746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic int nativeMoveGeneration(JNIEnv *env, jobject obj)
226846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
226936747fa778285f57f2f53c047028be83e9d8776dCary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
227036747fa778285f57f2f53c047028be83e9d8776dCary Clark    if (!view)
227136747fa778285f57f2f53c047028be83e9d8776dCary Clark        return 0;
2272b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark    return view->moveGeneration();
227346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
227446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
2275a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeMoveSelection(JNIEnv *env, jobject obj, int x, int y)
22768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2277a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    GET_NATIVE_VIEW(env, obj)->moveSelection(x, y);
2278a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
2279a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
2280a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeResetSelection(JNIEnv *env, jobject obj)
2281a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
2282a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return GET_NATIVE_VIEW(env, obj)->resetSelection();
2283a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
2284a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
2285515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clarkstatic jobject nativeSelectableText(JNIEnv* env, jobject obj)
2286515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark{
2287515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    IntPoint pos = GET_NATIVE_VIEW(env, obj)->selectableText();
2288515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    jclass pointClass = env->FindClass("android/graphics/Point");
2289515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    jmethodID init = env->GetMethodID(pointClass, "<init>", "(II)V");
2290515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    jobject point = env->NewObject(pointClass, init, pos.x(), pos.y());
2291515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    env->DeleteLocalRef(pointClass);
2292515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    return point;
2293515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark}
2294515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark
2295a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeSelectAll(JNIEnv* env, jobject obj)
2296a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
2297a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    GET_NATIVE_VIEW(env, obj)->selectAll();
2298a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
2299a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
2300a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeSetExtendSelection(JNIEnv *env, jobject obj)
2301a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
2302a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    GET_NATIVE_VIEW(env, obj)->setExtendSelection();
2303a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
2304a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
2305a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic jboolean nativeStartSelection(JNIEnv *env, jobject obj, int x, int y)
2306a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
2307a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return GET_NATIVE_VIEW(env, obj)->startSelection(x, y);
2308a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
2309a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
2310a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic jboolean nativeWordSelection(JNIEnv *env, jobject obj, int x, int y)
2311a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
2312a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return GET_NATIVE_VIEW(env, obj)->wordSelection(x, y);
2313a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
2314a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
2315a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeExtendSelection(JNIEnv *env, jobject obj, int x, int y)
2316a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
2317a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    GET_NATIVE_VIEW(env, obj)->extendSelection(x, y);
23188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jobject nativeGetSelection(JNIEnv *env, jobject obj)
23218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
23238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
23245e5962825729a211e093fd615ddc9e5b0bec10bdCary Clark    String selection = view->getSelection();
232579b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block    return wtfStringToJstring(env, selection);
23268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2328a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic jboolean nativeHitSelection(JNIEnv *env, jobject obj, int x, int y)
2329a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
2330a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return GET_NATIVE_VIEW(env, obj)->hitSelection(x, y);
2331a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
2332a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
2333a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic jint nativeSelectionX(JNIEnv *env, jobject obj)
233487962ce00229855c098ba12cee8d5c015a835289Cary Clark{
2335a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return GET_NATIVE_VIEW(env, obj)->selectionX();
233687962ce00229855c098ba12cee8d5c015a835289Cary Clark}
233787962ce00229855c098ba12cee8d5c015a835289Cary Clark
2338a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic jint nativeSelectionY(JNIEnv *env, jobject obj)
2339a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
2340a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return GET_NATIVE_VIEW(env, obj)->selectionY();
2341a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
2342a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
2343a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeSetSelectionPointer(JNIEnv *env, jobject obj, jboolean set,
2344a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    jfloat scale, jint x, jint y)
234587962ce00229855c098ba12cee8d5c015a835289Cary Clark{
2346a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    GET_NATIVE_VIEW(env, obj)->setSelectionPointer(set, scale, x, y);
234787962ce00229855c098ba12cee8d5c015a835289Cary Clark}
234887962ce00229855c098ba12cee8d5c015a835289Cary Clark
23498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_DUMP_DISPLAY_TREE
23508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void dumpToFile(const char text[], void* file) {
23518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fwrite(text, 1, strlen(text), reinterpret_cast<FILE*>(file));
23528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fwrite("\n", 1, 1, reinterpret_cast<FILE*>(file));
23538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
23558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeDumpDisplayTree(JNIEnv* env, jobject jwebview, jstring jurl)
23578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_DUMP_DISPLAY_TREE
23598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, jwebview);
23608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
23618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2362bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed    if (view && view->getWebViewCore()) {
2363bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed        FILE* file = fopen(DISPLAY_TREE_LOG_FILE, "w");
2364bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed        if (file) {
2365bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            SkFormatDumper dumper(dumpToFile, file);
2366bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // dump the URL
2367bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            if (jurl) {
2368bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed                const char* str = env->GetStringUTFChars(jurl, 0);
2369bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed                SkDebugf("Dumping %s to %s\n", str, DISPLAY_TREE_LOG_FILE);
2370bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed                dumpToFile(str, file);
2371bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed                env->ReleaseStringUTFChars(jurl, str);
23728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
2373bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // now dump the display tree
2374bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            SkDumpCanvas canvas(&dumper);
2375bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // this will playback the picture into the canvas, which will
2376bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // spew its contents to the dumper
23776d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba            view->draw(&canvas, 0, 0, false);
2378bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // we're done with the file now
2379bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            fwrite("\n", 1, 1, file);
2380bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            fclose(file);
23818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2382859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
23836d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        const LayerAndroid* rootLayer = view->compositeRoot();
2384f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark        if (rootLayer) {
2385859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard          FILE* file = fopen(LAYERS_TREE_LOG_FILE,"w");
2386859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard          if (file) {
2387859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard              rootLayer->dumpLayers(file, 0);
2388859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard              fclose(file);
2389859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard          }
2390859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard        }
2391859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard#endif
23928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
23938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
23948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2396f81c672a4f5c06621000a6df0984cde689397d94Cary Clarkstatic int nativeScrollableLayer(JNIEnv* env, jobject jwebview, jint x, jint y,
2397f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    jobject rect, jobject bounds)
2398a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{
2399a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    WebView* view = GET_NATIVE_VIEW(env, jwebview);
2400a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
2401f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    SkIRect nativeRect, nativeBounds;
2402f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    int id = view->scrollableLayer(x, y, &nativeRect, &nativeBounds);
2403f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins    if (rect)
2404f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins        GraphicsJNI::irect_to_jrect(nativeRect, env, rect);
2405f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins    if (bounds)
2406f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins        GraphicsJNI::irect_to_jrect(nativeBounds, env, bounds);
240722e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott    return id;
2408a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott}
2409a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott
241022e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scottstatic bool nativeScrollLayer(JNIEnv* env, jobject obj, jint layerId, jint x,
241122e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott        jint y)
2412a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{
2413a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL)
2414a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    WebView* view = GET_NATIVE_VIEW(env, obj);
24158598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott    LayerAndroid* root = view->compositeRoot();
24168598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott    if (!root)
24178598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott        return false;
24188598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott    LayerAndroid* layer = root->findById(layerId);
2419fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott    if (!layer || !layer->contentIsScrollable())
2420a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        return false;
2421fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott    return static_cast<ScrollableLayerAndroid*>(layer)->scrollTo(x, y);
2422a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#endif
2423a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    return false;
2424a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott}
2425a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott
24264da96b9950ba2e86203aa50be39adcc8431a95a4Ben Murdochstatic void nativeSetExpandedTileBounds(JNIEnv*, jobject, jboolean enabled)
24274da96b9950ba2e86203aa50be39adcc8431a95a4Ben Murdoch{
24284da96b9950ba2e86203aa50be39adcc8431a95a4Ben Murdoch    TilesManager::instance()->setExpandedTileBounds(enabled);
24294da96b9950ba2e86203aa50be39adcc8431a95a4Ben Murdoch}
24304da96b9950ba2e86203aa50be39adcc8431a95a4Ben Murdoch
24318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
24328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * JNI registration
24338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
24348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic JNINativeMethod gJavaWebViewMethods[] = {
2435d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    { "nativeCacheHitFramePointer", "()I",
2436d4924af12855cd19162ba1442a6055664c98ca32Cary Clark        (void*) nativeCacheHitFramePointer },
2437b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark    { "nativeCacheHitIsPlugin", "()Z",
2438b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark        (void*) nativeCacheHitIsPlugin },
2439d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    { "nativeCacheHitNodeBounds", "()Landroid/graphics/Rect;",
2440d4924af12855cd19162ba1442a6055664c98ca32Cary Clark        (void*) nativeCacheHitNodeBounds },
2441d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    { "nativeCacheHitNodePointer", "()I",
2442d4924af12855cd19162ba1442a6055664c98ca32Cary Clark        (void*) nativeCacheHitNodePointer },
2443c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    { "nativeClearCursor", "()V",
2444bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeClearCursor },
24454de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins    { "nativeCreate", "(ILjava/lang/String;Landroid/content/res/AssetManager;)V",
24468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeCreate },
244746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeCursorFramePointer", "()I",
244846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeCursorFramePointer },
24491cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    { "nativePageShouldHandleShiftAndArrows", "()Z",
24501cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins        (void*) nativePageShouldHandleShiftAndArrows },
245146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeCursorNodeBounds", "()Landroid/graphics/Rect;",
245246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeCursorNodeBounds },
245346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeCursorNodePointer", "()I",
245446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeCursorNodePointer },
245546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeCursorIntersects", "(Landroid/graphics/Rect;)Z",
245646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeCursorIntersects },
245746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeCursorIsAnchor", "()Z",
245846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeCursorIsAnchor },
245946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeCursorIsTextInput", "()Z",
246046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeCursorIsTextInput },
246136747fa778285f57f2f53c047028be83e9d8776dCary Clark    { "nativeCursorPosition", "()Landroid/graphics/Point;",
246236747fa778285f57f2f53c047028be83e9d8776dCary Clark        (void*) nativeCursorPosition },
246346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeCursorText", "()Ljava/lang/String;",
246446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeCursorText },
2465f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark    { "nativeCursorWantsKeyEvents", "()Z",
2466f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark        (void*)nativeCursorWantsKeyEvents },
24678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeDebugDump", "()V",
24688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeDebugDump },
24698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeDestroy", "()V",
24708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeDestroy },
24716d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    { "nativeDraw", "(Landroid/graphics/Canvas;IIZ)I",
24726d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeDraw },
2473908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    { "nativeGetDrawGLFunction", "(Landroid/graphics/Rect;FI)I",
2474908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        (void*) nativeGetDrawGLFunction },
2475908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    { "nativeUpdateDrawGLFunction", "(Landroid/graphics/Rect;)V",
2476908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        (void*) nativeUpdateDrawGLFunction },
2477a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    { "nativeDrawGL", "(Landroid/graphics/Rect;FI)Z",
2478a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        (void*) nativeDrawGL },
247946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeDumpDisplayTree", "(Ljava/lang/String;)V",
248046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeDumpDisplayTree },
248187962ce00229855c098ba12cee8d5c015a835289Cary Clark    { "nativeEvaluateLayersAnimations", "()Z",
248287962ce00229855c098ba12cee8d5c015a835289Cary Clark        (void*) nativeEvaluateLayersAnimations },
2483a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeExtendSelection", "(II)V",
2484a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeExtendSelection },
2485db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    { "nativeFindAll", "(Ljava/lang/String;Ljava/lang/String;Z)I",
248646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeFindAll },
248746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeFindNext", "(Z)V",
248846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeFindNext },
2489afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins    { "nativeFindIndex", "()I",
2490afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins        (void*) nativeFindIndex},
249149e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark    { "nativeFocusCandidateFramePointer", "()I",
249249e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark        (void*) nativeFocusCandidateFramePointer },
24932194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins    { "nativeFocusCandidateHasNextTextfield", "()Z",
24942194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins        (void*) focusCandidateHasNextTextfield },
2495bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeFocusCandidateIsPassword", "()Z",
2496bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidateIsPassword },
2497bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeFocusCandidateIsRtlText", "()Z",
2498bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidateIsRtlText },
2499bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeFocusCandidateIsTextInput", "()Z",
2500bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidateIsTextInput },
2501d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins    { "nativeFocusCandidateLineHeight", "()I",
2502d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins        (void*) nativeFocusCandidateLineHeight },
2503bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeFocusCandidateMaxLength", "()I",
2504bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidateMaxLength },
2505ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins    { "nativeFocusCandidateIsAutoComplete", "()Z",
2506ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins        (void*) nativeFocusCandidateIsAutoComplete },
2507bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeFocusCandidateName", "()Ljava/lang/String;",
2508bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidateName },
2509bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeFocusCandidateNodeBounds", "()Landroid/graphics/Rect;",
2510bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidateNodeBounds },
2511390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    { "nativeFocusCandidatePaddingRect", "()Landroid/graphics/Rect;",
2512390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins        (void*) nativeFocusCandidatePaddingRect },
2513bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeFocusCandidatePointer", "()I",
2514bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidatePointer },
2515bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeFocusCandidateText", "()Ljava/lang/String;",
2516bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidateText },
25173a3b28707d2d6a06afe9f3137e9bedc07246d600Leon Scroggins    { "nativeFocusCandidateTextSize", "()F",
2518bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidateTextSize },
251974757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins    { "nativeFocusCandidateType", "()I",
252074757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins        (void*) nativeFocusCandidateType },
2521c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger    { "nativeFocusIsPlugin", "()Z",
2522c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger        (void*) nativeFocusIsPlugin },
25238026280044128436d8e89736519a0b32b6540201Cary Clark    { "nativeFocusNodeBounds", "()Landroid/graphics/Rect;",
25248026280044128436d8e89736519a0b32b6540201Cary Clark        (void*) nativeFocusNodeBounds },
2525539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins    { "nativeFocusNodePointer", "()I",
2526539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins        (void*) nativeFocusNodePointer },
252746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeGetCursorRingBounds", "()Landroid/graphics/Rect;",
252846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeGetCursorRingBounds },
25295e5962825729a211e093fd615ddc9e5b0bec10bdCary Clark    { "nativeGetSelection", "()Ljava/lang/String;",
253046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeGetSelection },
253146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeHasCursorNode", "()Z",
253246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeHasCursorNode },
253346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeHasFocusNode", "()Z",
253446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeHasFocusNode },
2535c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    { "nativeHideCursor", "()V",
2536c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark        (void*) nativeHideCursor },
2537a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeHitSelection", "(II)Z",
2538a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeHitSelection },
253946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeImageURI", "(II)Ljava/lang/String;",
254046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeImageURI },
25418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeInstrumentReport", "()V",
25428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeInstrumentReport },
25439092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    { "nativeLayerBounds", "(I)Landroid/graphics/Rect;",
25449092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark        (void*) nativeLayerBounds },
2545d48434fc633d173b549b97b1c614072adc9648a8Cary Clark    { "nativeMotionUp", "(III)Z",
25468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeMotionUp },
2547bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeMoveCursor", "(IIZ)Z",
2548bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeMoveCursor },
25498480ea3097f295aeccf7c088a06cceea543238b7Leon Scroggins    { "nativeMoveCursorToNextTextInput", "()Z",
2550e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins        (void*) nativeMoveCursorToNextTextInput },
255146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeMoveGeneration", "()I",
255246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeMoveGeneration },
2553a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeMoveSelection", "(II)V",
255446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeMoveSelection },
2555d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    { "nativePointInNavCache", "(III)Z",
2556d4924af12855cd19162ba1442a6055664c98ca32Cary Clark        (void*) nativePointInNavCache },
25578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeRecordButtons", "(ZZZ)V",
25588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeRecordButtons },
2559a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeResetSelection", "()V",
2560a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeResetSelection },
2561515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    { "nativeSelectableText", "()Landroid/graphics/Point;",
2562515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark        (void*) nativeSelectableText },
2563a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeSelectAll", "()V",
2564a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeSelectAll },
25658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeSelectBestAt", "(Landroid/graphics/Rect;)V",
25668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeSelectBestAt },
25671b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov    { "nativeSelectAt", "(II)V",
25681b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov        (void*) nativeSelectAt },
2569a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeSelectionX", "()I",
2570a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeSelectionX },
2571a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeSelectionY", "()I",
2572a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeSelectionY },
2573a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeSetExtendSelection", "()V",
2574a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeSetExtendSelection },
2575afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    { "nativeSetFindIsEmpty", "()V",
2576afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark        (void*) nativeSetFindIsEmpty },
2577afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    { "nativeSetFindIsUp", "(Z)V",
2578d74d4ceff106be90d9eaf08ec191a96bd87a7007Cary Clark        (void*) nativeSetFindIsUp },
25798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeSetHeightCanMeasure", "(Z)V",
25808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeSetHeightCanMeasure },
258103d850006e8ce54945fe44c36ffaf074143184c5Teng-Hui Zhu    { "nativeSetBaseLayer", "(ILandroid/graphics/Rect;Z)V",
25826d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeSetBaseLayer },
25836d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    { "nativeReplaceBaseContent", "(I)V",
25846d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeReplaceBaseContent },
25856d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    { "nativeCopyBaseContentToPicture", "(Landroid/graphics/Picture;)V",
25866d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeCopyBaseContentToPicture },
25876d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    { "nativeHasContent", "()Z",
25886d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeHasContent },
2589a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeSetSelectionPointer", "(ZFII)V",
259087962ce00229855c098ba12cee8d5c015a835289Cary Clark        (void*) nativeSetSelectionPointer },
259132dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    { "nativeShowCursorTimed", "()V",
259232dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark        (void*) nativeShowCursorTimed },
2593a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeStartSelection", "(II)Z",
2594a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeStartSelection },
25958360bc9c9facd690e42379610cbbb368d3d705efCary Clark    { "nativeStopGL", "()V",
25968360bc9c9facd690e42379610cbbb368d3d705efCary Clark        (void*) nativeStopGL },
2597cc4e3c422964c7d999e8f340057f303140d845ddCary Clark    { "nativeSubtractLayers", "(Landroid/graphics/Rect;)Landroid/graphics/Rect;",
2598cc4e3c422964c7d999e8f340057f303140d845ddCary Clark        (void*) nativeSubtractLayers },
259946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeTextGeneration", "()I",
260046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeTextGeneration },
26018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeUpdateCachedTextfield", "(Ljava/lang/String;I)V",
2602b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark        (void*) nativeUpdateCachedTextfield },
2603a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    {  "nativeWordSelection", "(II)Z",
2604a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeWordSelection },
2605fa768f11d82c34980cce020f442329299efb08caCary Clark    { "nativeGetBlockLeftEdge", "(IIF)I",
2606a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba        (void*) nativeGetBlockLeftEdge },
2607f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    { "nativeScrollableLayer", "(IILandroid/graphics/Rect;Landroid/graphics/Rect;)I",
2608a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        (void*) nativeScrollableLayer },
2609a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    { "nativeScrollLayer", "(III)Z",
2610a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        (void*) nativeScrollLayer },
26114da96b9950ba2e86203aa50be39adcc8431a95a4Ben Murdoch    { "nativeSetExpandedTileBounds", "(Z)V",
26124da96b9950ba2e86203aa50be39adcc8431a95a4Ben Murdoch        (void*) nativeSetExpandedTileBounds },
26138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
26148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2615b92850e0391d674b9c4826b66105aaa3dd3eef96Steve Blockint registerWebView(JNIEnv* env)
26168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
26178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jclass clazz = env->FindClass("android/webkit/WebView");
26188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(clazz, "Unable to find class android/webkit/WebView");
26198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    gWebViewField = env->GetFieldID(clazz, "mNativeClass", "I");
26208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(gWebViewField, "Unable to find android/webkit/WebView.mNativeClass");
2621bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(clazz);
26228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
26238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return jniRegisterNativeMethods(env, "android/webkit/WebView", gJavaWebViewMethods, NELEM(gJavaWebViewMethods));
26248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
26258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
26268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace android
2627