WebView.cpp revision dfadaafc15c16563aba837f05c778eaa2a433a8b
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"
46d1f5cf1ad8b20860bd9cb34a483451019124d1f9Romain Guy#include "private/hwui/DrawGlInfo.h"
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformGraphicsContext.h"
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h"
49fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott#include "ScrollableLayerAndroid.h"
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SelectText.h"
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkCanvas.h"
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkDumpCanvas.h"
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkPicture.h"
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkRect.h"
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkTime.h"
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_INSTRUMENT
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TimeCounter.h"
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
59a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "TilesManager.h"
6020ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "WebCoreJni.h"
610b84ecf50c01e0fbf7307ca7cae55ab3043c75a3Elliott Slaughter#include "WebRequestContext.h"
6220ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "WebViewCore.h"
6320ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "android_graphics.h"
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef GET_NATIVE_VIEW
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#undef GET_NATIVE_VIEW
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define GET_NATIVE_VIEW(env, obj) ((WebView*)env->GetIntField(obj, gWebViewField))
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7120ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include <JNIUtility.h>
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <JNIHelp.h>
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <jni.h>
744de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins#include <android_runtime/android_util_AssetManager.h>
7520ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include <ui/KeycodeLabels.h>
764de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins#include <utils/AssetManager.h>
77dd7ee22af4f03672fa823324323466054f19a054Iain Merrick#include <wtf/text/AtomicString.h>
7879768700a853c40c66ff0b0591957958667fdd9eSteve Block#include <wtf/text/CString.h>
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace android {
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jfieldID gWebViewField;
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//-------------------------------------
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jmethodID GetJMethod(JNIEnv* env, jclass clazz, const char name[], const char signature[])
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID m = env->GetMethodID(clazz, name, signature);
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(m, "Could not find method %s", name);
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m;
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//-------------------------------------
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This class provides JNI for making calls into native code from the UI side
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// of the multi-threaded WebView.
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass WebView
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectenum FrameCachePermission {
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DontAllowNewer,
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AllowNewer,
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AllowNewest
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10587962ce00229855c098ba12cee8d5c015a835289Cary Clarkenum DrawExtras { // keep this in sync with WebView.java
10687962ce00229855c098ba12cee8d5c015a835289Cary Clark    DrawExtrasNone = 0,
10787962ce00229855c098ba12cee8d5c015a835289Cary Clark    DrawExtrasFind = 1,
10887962ce00229855c098ba12cee8d5c015a835289Cary Clark    DrawExtrasSelection = 2,
10987962ce00229855c098ba12cee8d5c015a835289Cary Clark    DrawExtrasCursorRing = 3
11087962ce00229855c098ba12cee8d5c015a835289Cary Clark};
11187962ce00229855c098ba12cee8d5c015a835289Cary Clark
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct JavaGlue {
1133bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott    jweak       m_obj;
114ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    jmethodID   m_calcOurContentVisibleRectF;
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_overrideLoading;
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_scrollBy;
117bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins    jmethodID   m_sendMoveFocus;
11846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    jmethodID   m_sendMoveMouse;
11946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    jmethodID   m_sendMoveMouseIfLatest;
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_sendMotionUp;
12195fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins    jmethodID   m_domChangedFocus;
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_getScaledMaxXScroll;
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_getScaledMaxYScroll;
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_getVisibleRect;
12594d36f098e1c65d69568e6fb00124c542e5c7f6fLeon Scroggins    jmethodID   m_rebuildWebTextView;
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_viewInvalidate;
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_viewInvalidateRect;
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_postInvalidateDelayed;
1293deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger    jmethodID   m_inFullScreenMode;
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jfieldID    m_rectLeft;
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jfieldID    m_rectTop;
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_rectWidth;
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_rectHeight;
134ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    jfieldID    m_rectFLeft;
135ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    jfieldID    m_rectFTop;
136ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    jmethodID   m_rectFWidth;
137ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    jmethodID   m_rectFHeight;
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AutoJObject object(JNIEnv* env) {
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return getRealObject(env, m_obj);
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} m_javaGlue;
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1434de82d04a6a82fee6e2d924768e88af58e966982Leon ScrogginsWebView(JNIEnv* env, jobject javaWebView, int viewImpl, WTF::String drawableDir, AssetManager* am) :
14487962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_ring((WebViewCore*) viewImpl)
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jclass clazz = env->FindClass("android/webkit/WebView");
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project //   m_javaGlue = new JavaGlue;
1483bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott    m_javaGlue.m_obj = env->NewWeakGlobalRef(javaWebView);
14951c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins    m_javaGlue.m_scrollBy = GetJMethod(env, clazz, "setContentScrollBy", "(IIZ)Z");
150ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    m_javaGlue.m_calcOurContentVisibleRectF = GetJMethod(env, clazz, "calcOurContentVisibleRectF", "(Landroid/graphics/RectF;)V");
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_overrideLoading = GetJMethod(env, clazz, "overrideLoading", "(Ljava/lang/String;)V");
152bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins    m_javaGlue.m_sendMoveFocus = GetJMethod(env, clazz, "sendMoveFocus", "(II)V");
15346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    m_javaGlue.m_sendMoveMouse = GetJMethod(env, clazz, "sendMoveMouse", "(IIII)V");
15494f12574c74b11db011b994e462f64a112952a47Leon Scroggins    m_javaGlue.m_sendMoveMouseIfLatest = GetJMethod(env, clazz, "sendMoveMouseIfLatest", "(ZZ)V");
155ee260612d8744993644f2e0b0f1fed51423be6dbLeon Scroggins    m_javaGlue.m_sendMotionUp = GetJMethod(env, clazz, "sendMotionUp", "(IIIII)V");
15695fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins    m_javaGlue.m_domChangedFocus = GetJMethod(env, clazz, "domChangedFocus", "()V");
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_getScaledMaxXScroll = GetJMethod(env, clazz, "getScaledMaxXScroll", "()I");
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_getScaledMaxYScroll = GetJMethod(env, clazz, "getScaledMaxYScroll", "()I");
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_getVisibleRect = GetJMethod(env, clazz, "sendOurVisibleRect", "()Landroid/graphics/Rect;");
16094d36f098e1c65d69568e6fb00124c542e5c7f6fLeon Scroggins    m_javaGlue.m_rebuildWebTextView = GetJMethod(env, clazz, "rebuildWebTextView", "()V");
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_viewInvalidate = GetJMethod(env, clazz, "viewInvalidate", "()V");
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_viewInvalidateRect = GetJMethod(env, clazz, "viewInvalidate", "(IIII)V");
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_postInvalidateDelayed = GetJMethod(env, clazz,
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        "viewInvalidateDelayed", "(JIIII)V");
1653deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger    m_javaGlue.m_inFullScreenMode = GetJMethod(env, clazz, "inFullScreenMode", "()Z");
166bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(clazz);
167bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jclass rectClass = env->FindClass("android/graphics/Rect");
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(rectClass, "Could not find Rect class");
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_rectLeft = env->GetFieldID(rectClass, "left", "I");
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_rectTop = env->GetFieldID(rectClass, "top", "I");
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_rectWidth = GetJMethod(env, rectClass, "width", "()I");
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_rectHeight = GetJMethod(env, rectClass, "height", "()I");
174bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(rectClass);
175bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block
176ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    jclass rectClassF = env->FindClass("android/graphics/RectF");
177ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    LOG_ASSERT(rectClassF, "Could not find RectF class");
178ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    m_javaGlue.m_rectFLeft = env->GetFieldID(rectClassF, "left", "F");
179ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    m_javaGlue.m_rectFTop = env->GetFieldID(rectClassF, "top", "F");
180ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    m_javaGlue.m_rectFWidth = GetJMethod(env, rectClassF, "width", "()F");
181ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    m_javaGlue.m_rectFHeight = GetJMethod(env, rectClassF, "height", "()F");
182bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(rectClassF);
183bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    env->SetIntField(javaWebView, gWebViewField, (jint)this);
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewImpl = (WebViewCore*) viewImpl;
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frameCacheUI = 0;
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_navPictureUI = 0;
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_generation = 0;
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_heightCanMeasure = false;
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_lastDx = 0;
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_lastDxTime = 0;
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_ringAnimationEnd = 0;
1936d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    m_baseLayer = 0;
194908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    m_glDrawFunctor = 0;
1954de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins    if (drawableDir.isEmpty())
1964de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins        m_buttonSkin = 0;
1974de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins    else
1984de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins        m_buttonSkin = new RenderSkinButton(am, drawableDir);
199c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger#if USE(ACCELERATED_COMPOSITING)
200c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    m_glWebViewState = 0;
201c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger#endif
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project~WebView()
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_javaGlue.m_obj)
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        JNIEnv* env = JSC::Bindings::getJNIEnv();
2093bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott        env->DeleteWeakGlobalRef(m_javaGlue.m_obj);
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_javaGlue.m_obj = 0;
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
21275394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
213c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    // We must remove the m_glWebViewState prior to deleting m_baseLayer. If we
214c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    // do not remove it here, we risk having BaseTiles trying to paint using a
215c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    // deallocated base layer.
2168360bc9c9facd690e42379610cbbb368d3d705efCary Clark    stopGL();
21775394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roard#endif
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete m_frameCacheUI;
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete m_navPictureUI;
220b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger    SkSafeUnref(m_baseLayer);
221908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    delete m_glDrawFunctor;
2224de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins    delete m_buttonSkin;
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2258360bc9c9facd690e42379610cbbb368d3d705efCary Clarkvoid stopGL()
2268360bc9c9facd690e42379610cbbb368d3d705efCary Clark{
2278360bc9c9facd690e42379610cbbb368d3d705efCary Clark#if USE(ACCELERATED_COMPOSITING)
2288360bc9c9facd690e42379610cbbb368d3d705efCary Clark    delete m_glWebViewState;
2298360bc9c9facd690e42379610cbbb368d3d705efCary Clark    m_glWebViewState = 0;
2308360bc9c9facd690e42379610cbbb368d3d705efCary Clark#endif
2318360bc9c9facd690e42379610cbbb368d3d705efCary Clark}
2328360bc9c9facd690e42379610cbbb368d3d705efCary Clark
233bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike ReedWebViewCore* getWebViewCore() const {
234bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed    return m_viewImpl;
235bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed}
236bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed
237c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark// removes the cursor altogether (e.g., when going to a new page)
238c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clarkvoid clearCursor()
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedRoot* root = getFrameCache(AllowNewer);
241c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    if (!root)
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
243c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    DBG_NAV_LOG("");
24469bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins    m_viewImpl->m_hasCursorBounds = false;
245c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    root->clearCursor();
246c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    viewInvalidate();
247c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark}
248c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark
249c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark// leaves the cursor where it is, but suppresses drawing it
250c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clarkvoid hideCursor()
251c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark{
252c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    CachedRoot* root = getFrameCache(AllowNewer);
253c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    if (!root)
254c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark        return;
255c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    DBG_NAV_LOG("");
2560924a66d1664f53afd148456e5709c471ff7240aCary Clark    hideCursor(root);
2570924a66d1664f53afd148456e5709c471ff7240aCary Clark}
2580924a66d1664f53afd148456e5709c471ff7240aCary Clark
2590924a66d1664f53afd148456e5709c471ff7240aCary Clarkvoid hideCursor(CachedRoot* root)
2600924a66d1664f53afd148456e5709c471ff7240aCary Clark{
2610924a66d1664f53afd148456e5709c471ff7240aCary Clark    DBG_NAV_LOG("inner");
26269bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins    m_viewImpl->m_hasCursorBounds = false;
263c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    root->hideCursor();
264c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    viewInvalidate();
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if DUMP_NAV_CACHE
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid debugDump()
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedRoot* root = getFrameCache(DontAllowNewer);
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (root)
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        root->mDebug.print();
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Traverse our stored array of buttons that are in our picture, and update
27746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark// their subpictures according to their current state.
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Called from the UI thread.  This is the one place in the UI thread where we
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// access the buttons stored in the WebCore thread.
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// hasFocus keeps track of whether the WebView has focus && windowFocus.
28146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark// If not, we do not want to draw the button in a selected or pressed state
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid nativeRecordButtons(bool hasFocus, bool pressed, bool invalidate)
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
28446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    bool cursorIsOnButton = false;
285f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedFrame* cachedFrame;
28646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedNode* cachedCursor = 0;
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Lock the mutex, since we now share with the WebCore thread.
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewImpl->gButtonMutex.lock();
2894de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins    if (m_viewImpl->m_buttons.size() && m_buttonSkin) {
29046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        // FIXME: In a future change, we should keep track of whether the selection
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // has changed to short circuit (note that we would still need to update
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // if we received new buttons from the WebCore thread).
29346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        WebCore::Node* cursor = 0;
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CachedRoot* root = getFrameCache(DontAllowNewer);
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (root) {
296f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark            cachedCursor = root->currentCursor(&cachedFrame);
29746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark            if (cachedCursor)
29846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark                cursor = (WebCore::Node*) cachedCursor->nodePointer();
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Traverse the array, and update each button, depending on whether it
30246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        // is selected.
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Container* end = m_viewImpl->m_buttons.end();
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (Container* ptr = m_viewImpl->m_buttons.begin(); ptr != end; ptr++) {
305438cced0716e328ab5e424e35b377d2dd686f46bCary Clark            RenderSkinAndroid::State state = RenderSkinAndroid::kNormal;
30646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark            if (ptr->matches(cursor)) {
30746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark                cursorIsOnButton = true;
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // If the WebView is out of focus/window focus, set the state to
30946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark                // normal, but still keep track of the fact that the selected is a
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // button
311438cced0716e328ab5e424e35b377d2dd686f46bCary Clark                if (hasFocus) {
312438cced0716e328ab5e424e35b377d2dd686f46bCary Clark                    if (pressed || m_ring.m_isPressed)
313438cced0716e328ab5e424e35b377d2dd686f46bCary Clark                        state = RenderSkinAndroid::kPressed;
314cd8a18fcca4aaa5658aaf236b034516fccac7932Cary Clark                    else if (SkTime::GetMSecs() < m_ringAnimationEnd)
315438cced0716e328ab5e424e35b377d2dd686f46bCary Clark                        state = RenderSkinAndroid::kFocused;
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
3184de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins            ptr->updateFocusState(state, m_buttonSkin);
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewImpl->gButtonMutex.unlock();
32246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    if (invalidate && cachedCursor && cursorIsOnButton) {
323f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark        const WebCore::IntRect& b = cachedCursor->bounds(cachedFrame);
3241ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block        viewInvalidateRect(b.x(), b.y(), b.maxX(), b.maxY());
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3285065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark// The caller has already determined that the desired document rect corresponds
3295065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark// to the main picture, and not a layer
330afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clarkvoid scrollRectOnScreen(const IntRect& rect)
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
332afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    if (rect.isEmpty())
333afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark        return;
3345065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    SkRect visible;
3355065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    calcOurContentVisibleRect(&visible);
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int dx = 0;
337afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    int left = rect.x();
3381ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block    int right = rect.maxX();
3395065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    if (left < visible.fLeft) {
3405065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark        dx = left - visible.fLeft;
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Only scroll right if the entire width can fit on screen.
3425065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    } else if (right > visible.fRight && right - left < visible.width()) {
3435065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark        dx = right - visible.fRight;
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int dy = 0;
346afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    int top = rect.y();
3471ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block    int bottom = rect.maxY();
3485065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    if (top < visible.fTop) {
3495065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark        dy = top - visible.fTop;
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Only scroll down if the entire height can fit on screen
3515065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    } else if (bottom > visible.fBottom && bottom - top < visible.height()) {
3525065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark        dy = bottom - visible.fBottom;
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
35451c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins    if ((dx|dy) == 0 || !scrollBy(dx, dy))
355afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark        return;
35651c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins    viewInvalidate();
357e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins}
358e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins
3595065a677456ac1cb630e5271e781b2aa796af7a5Cary Clarkvoid calcOurContentVisibleRect(SkRect* r)
3605065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark{
3615065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    JNIEnv* env = JSC::Bindings::getJNIEnv();
362b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
363b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
364b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
365ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    jclass rectClass = env->FindClass("android/graphics/RectF");
366ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    jmethodID init = env->GetMethodID(rectClass, "<init>", "(FFFF)V");
3675065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    jobject jRect = env->NewObject(rectClass, init, 0, 0, 0, 0);
368b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_calcOurContentVisibleRectF, jRect);
369ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    r->fLeft = env->GetFloatField(jRect, m_javaGlue.m_rectFLeft);
370ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    r->fTop = env->GetFloatField(jRect, m_javaGlue.m_rectFTop);
371ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    r->fRight = r->fLeft + env->CallFloatMethod(jRect, m_javaGlue.m_rectFWidth);
372ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    r->fBottom = r->fTop + env->CallFloatMethod(jRect, m_javaGlue.m_rectFHeight);
373bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(rectClass);
3745065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    env->DeleteLocalRef(jRect);
3755065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    checkException(env);
3765065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark}
3775065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark
378b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clarkvoid resetCursorRing()
379b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark{
38032dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    m_ringAnimationEnd = 0;
381b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark    m_viewImpl->m_hasCursorBounds = false;
382b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark}
383b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark
38487962ce00229855c098ba12cee8d5c015a835289Cary Clarkbool drawCursorPreamble(CachedRoot* root)
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
386dfadaafc15c16563aba837f05c778eaa2a433a8bJohn Reck    if (!root) return false;
387461c3fcad8dc54fa3240dcc0cb8989e690408578Cary Clark    const CachedFrame* frame;
388461c3fcad8dc54fa3240dcc0cb8989e690408578Cary Clark    const CachedNode* node = root->currentCursor(&frame);
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!node) {
39049e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark        DBG_NAV_LOGV("%s", "!node");
391b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark        resetCursorRing();
39287962ce00229855c098ba12cee8d5c015a835289Cary Clark        return false;
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
394cd8a18fcca4aaa5658aaf236b034516fccac7932Cary Clark    m_ring.setIsButton(node);
3953efa919a7f16fdb717e393f501c50d4844ffaed5Cary Clark    if (node->isHidden()) {
3963efa919a7f16fdb717e393f501c50d4844ffaed5Cary Clark        DBG_NAV_LOG("node->isHidden()");
39746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        m_viewImpl->m_hasCursorBounds = false;
39887962ce00229855c098ba12cee8d5c015a835289Cary Clark        return false;
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
400d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark#if USE(ACCELERATED_COMPOSITING)
401ea684c4f21a0b23ce2ca839f4e9f978d2d02de25Teng-Hui Zhu    if (node->isInLayer() && root->rootLayer()) {
402d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark        LayerAndroid* layer = const_cast<LayerAndroid*>(root->rootLayer());
403d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark        SkRect visible;
404d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark        calcOurContentVisibleRect(&visible);
405d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark        layer->updateFixedLayersPositions(visible);
406d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark        layer->updatePositions();
407d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark    }
408d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark#endif
409f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    setVisibleRect(root);
41087962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_ring.m_root = root;
41187962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_ring.m_frame = frame;
41287962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_ring.m_node = node;
41332dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    SkMSec time = SkTime::GetMSecs();
41432dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    m_ring.m_isPressed = time < m_ringAnimationEnd
41532dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark        && m_ringAnimationEnd != UINT_MAX;
41687962ce00229855c098ba12cee8d5c015a835289Cary Clark    return true;
41787962ce00229855c098ba12cee8d5c015a835289Cary Clark}
41887962ce00229855c098ba12cee8d5c015a835289Cary Clark
41987962ce00229855c098ba12cee8d5c015a835289Cary Clarkvoid drawCursorPostamble()
42087962ce00229855c098ba12cee8d5c015a835289Cary Clark{
42132dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    if (m_ringAnimationEnd == UINT_MAX)
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
42387962ce00229855c098ba12cee8d5c015a835289Cary Clark    SkMSec time = SkTime::GetMSecs();
42487962ce00229855c098ba12cee8d5c015a835289Cary Clark    if (time < m_ringAnimationEnd) {
42587962ce00229855c098ba12cee8d5c015a835289Cary Clark        // views assume that inval bounds coordinates are non-negative
42687962ce00229855c098ba12cee8d5c015a835289Cary Clark        WebCore::IntRect invalBounds(0, 0, INT_MAX, INT_MAX);
427ef1adcdfc805d4d13103f6f15cc5b4d96828a60fPatrick Scott        invalBounds.intersect(m_ring.m_absBounds);
42887962ce00229855c098ba12cee8d5c015a835289Cary Clark        postInvalidateDelayed(m_ringAnimationEnd - time, invalBounds);
42987962ce00229855c098ba12cee8d5c015a835289Cary Clark    } else {
4300924a66d1664f53afd148456e5709c471ff7240aCary Clark        hideCursor(const_cast<CachedRoot*>(m_ring.m_root));
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
43287962ce00229855c098ba12cee8d5c015a835289Cary Clark}
433846dd02baeb22227f22c9fda72e48f6810568c14Leon Scroggins
434be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roardbool drawGL(WebCore::IntRect& viewRect, WebCore::IntRect* invalRect, WebCore::IntRect& webViewRect,
435be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard            int titleBarHeight, WebCore::IntRect& clip, float scale, int extras)
436a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
437a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
4383deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger    if (!m_baseLayer || inFullScreenMode())
439a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        return false;
440a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
441e47399f767707497dfc68fc64b14621a8ca9959fTeng-Hui Zhu    if (!m_glWebViewState) {
442f3cef498906fce0a2d7787f7475f6df232baaeadCary Clark        m_glWebViewState = new GLWebViewState(&m_viewImpl->gButtonMutex);
443e47399f767707497dfc68fc64b14621a8ca9959fTeng-Hui Zhu        if (m_baseLayer->content()) {
44467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard            SkRegion region;
44567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard            SkIRect rect;
44667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard            rect.set(0, 0, m_baseLayer->content()->width(), m_baseLayer->content()->height());
44767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard            region.setRect(rect);
448dfadaafc15c16563aba837f05c778eaa2a433a8bJohn Reck            m_glWebViewState->setBaseLayer(m_baseLayer, region, false, true);
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    }
458a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    DrawExtra* extra = 0;
459a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    switch (extras) {
460a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        case DrawExtrasFind:
461a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard            extra = &m_findOnPage;
462a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard            break;
463a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        case DrawExtrasSelection:
464a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard            extra = &m_selectText;
465a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard            break;
466a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        case DrawExtrasCursorRing:
467a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard            if (drawCursorPreamble(root) && m_ring.setup()) {
468a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard                if (!m_ring.m_isButton)
469a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard                    extra = &m_ring;
470a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard                drawCursorPostamble();
471a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard            }
472a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard            break;
473a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        default:
474a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard            ;
475a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    }
476a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
477c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    unsigned int pic = m_glWebViewState->currentPictureCounter();
478c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger
479eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark    SkPicture picture;
480eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark    IntRect rect(0, 0, 0, 0);
481cd8a18fcca4aaa5658aaf236b034516fccac7932Cary Clark    bool allowSame = false;
4826edf92433a1c328f0b8e166fefc687e691dd7298Nicolas Roard    m_glWebViewState->resetRings();
483a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    if (extra) {
4846edf92433a1c328f0b8e166fefc687e691dd7298Nicolas Roard        if (extra == &m_ring) {
485dae0bcf2fadac43fd4c32c263ad3c1075ca8511dJohn Reck            m_glWebViewState->setRings(m_ring.rings(), m_ring.m_isPressed);
4866edf92433a1c328f0b8e166fefc687e691dd7298Nicolas Roard        } else {
4876edf92433a1c328f0b8e166fefc687e691dd7298Nicolas Roard            LayerAndroid mainPicture(m_navPictureUI);
4886edf92433a1c328f0b8e166fefc687e691dd7298Nicolas Roard            PictureSet* content = m_baseLayer->content();
4896edf92433a1c328f0b8e166fefc687e691dd7298Nicolas Roard            SkCanvas* canvas = picture.beginRecording(content->width(),
4906edf92433a1c328f0b8e166fefc687e691dd7298Nicolas Roard                content->height());
4916edf92433a1c328f0b8e166fefc687e691dd7298Nicolas Roard            extra->draw(canvas, &mainPicture, &rect);
4926edf92433a1c328f0b8e166fefc687e691dd7298Nicolas Roard            picture.endRecording();
4936edf92433a1c328f0b8e166fefc687e691dd7298Nicolas Roard        }
494dfadaafc15c16563aba837f05c778eaa2a433a8bJohn Reck    } else if (root && extras == DrawExtrasCursorRing && m_ring.m_isButton) {
495cd8a18fcca4aaa5658aaf236b034516fccac7932Cary Clark        const CachedFrame* cachedFrame;
496cd8a18fcca4aaa5658aaf236b034516fccac7932Cary Clark        const CachedNode* cachedCursor = root->currentCursor(&cachedFrame);
497cd8a18fcca4aaa5658aaf236b034516fccac7932Cary Clark        if (cachedCursor) {
498cd8a18fcca4aaa5658aaf236b034516fccac7932Cary Clark            rect = cachedCursor->bounds(cachedFrame);
499cd8a18fcca4aaa5658aaf236b034516fccac7932Cary Clark            allowSame = true;
500cd8a18fcca4aaa5658aaf236b034516fccac7932Cary Clark        }
501a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    }
502cd8a18fcca4aaa5658aaf236b034516fccac7932Cary Clark    m_glWebViewState->setExtra(m_baseLayer, picture, rect, allowSame);
5030ca8045217bb9b308ddb407d7a9ce17d92d9f9fbNicolas Roard
5040ca8045217bb9b308ddb407d7a9ce17d92d9f9fbNicolas Roard    LayerAndroid* compositeLayer = compositeRoot();
5050ca8045217bb9b308ddb407d7a9ce17d92d9f9fbNicolas Roard    if (compositeLayer)
5060ca8045217bb9b308ddb407d7a9ce17d92d9f9fbNicolas Roard        compositeLayer->setExtra(extra);
5070ca8045217bb9b308ddb407d7a9ce17d92d9f9fbNicolas Roard
508a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    SkRect visibleRect;
509a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    calcOurContentVisibleRect(&visibleRect);
510be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard    bool ret = m_glWebViewState->drawGL(viewRect, visibleRect, invalRect,
511be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard                                        webViewRect, titleBarHeight, clip, scale);
512c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    if (ret || m_glWebViewState->currentPictureCounter() != pic)
513a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        return true;
514a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
515a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    return false;
516a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
517a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
5186d43b9ceb777071c088fe12ee94af80e34816bcfGrace KlobaPictureSet* draw(SkCanvas* canvas, SkColor bgColor, int extras, bool split)
51987962ce00229855c098ba12cee8d5c015a835289Cary Clark{
5206d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    PictureSet* ret = 0;
5216d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (!m_baseLayer) {
5226d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        canvas->drawColor(bgColor);
5236d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return ret;
5246d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    }
5256d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
5266d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    // draw the content of the base layer first
5276d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    PictureSet* content = m_baseLayer->content();
5286d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    int sc = canvas->save(SkCanvas::kClip_SaveFlag);
5296d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    canvas->clipRect(SkRect::MakeLTRB(0, 0, content->width(),
5306d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba                content->height()), SkRegion::kDifference_Op);
5316d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    canvas->drawColor(bgColor);
5326d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    canvas->restoreToCount(sc);
5336d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (content->draw(canvas))
5346d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        ret = split ? new PictureSet(*content) : 0;
5356d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
53687962ce00229855c098ba12cee8d5c015a835289Cary Clark    CachedRoot* root = getFrameCache(AllowNewer);
53787962ce00229855c098ba12cee8d5c015a835289Cary Clark    if (!root) {
53887962ce00229855c098ba12cee8d5c015a835289Cary Clark        DBG_NAV_LOG("!root");
53987962ce00229855c098ba12cee8d5c015a835289Cary Clark        if (extras == DrawExtrasCursorRing)
54087962ce00229855c098ba12cee8d5c015a835289Cary Clark            resetCursorRing();
541846dd02baeb22227f22c9fda72e48f6810568c14Leon Scroggins    }
54287962ce00229855c098ba12cee8d5c015a835289Cary Clark    LayerAndroid mainPicture(m_navPictureUI);
54387962ce00229855c098ba12cee8d5c015a835289Cary Clark    DrawExtra* extra = 0;
54487962ce00229855c098ba12cee8d5c015a835289Cary Clark    switch (extras) {
54587962ce00229855c098ba12cee8d5c015a835289Cary Clark        case DrawExtrasFind:
54687962ce00229855c098ba12cee8d5c015a835289Cary Clark            extra = &m_findOnPage;
54787962ce00229855c098ba12cee8d5c015a835289Cary Clark            break;
54887962ce00229855c098ba12cee8d5c015a835289Cary Clark        case DrawExtrasSelection:
54987962ce00229855c098ba12cee8d5c015a835289Cary Clark            extra = &m_selectText;
55087962ce00229855c098ba12cee8d5c015a835289Cary Clark            break;
55187962ce00229855c098ba12cee8d5c015a835289Cary Clark        case DrawExtrasCursorRing:
55287962ce00229855c098ba12cee8d5c015a835289Cary Clark            if (drawCursorPreamble(root) && m_ring.setup()) {
55387962ce00229855c098ba12cee8d5c015a835289Cary Clark                if (!m_ring.m_isButton)
55487962ce00229855c098ba12cee8d5c015a835289Cary Clark                    extra = &m_ring;
55587962ce00229855c098ba12cee8d5c015a835289Cary Clark                drawCursorPostamble();
55687962ce00229855c098ba12cee8d5c015a835289Cary Clark            }
55787962ce00229855c098ba12cee8d5c015a835289Cary Clark            break;
55887962ce00229855c098ba12cee8d5c015a835289Cary Clark        default:
55987962ce00229855c098ba12cee8d5c015a835289Cary Clark            ;
560846dd02baeb22227f22c9fda72e48f6810568c14Leon Scroggins    }
561eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark    if (extra) {
562eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark        IntRect dummy; // inval area, unused for now
563eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark        extra->draw(canvas, &mainPicture, &dummy);
564eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark    }
56587962ce00229855c098ba12cee8d5c015a835289Cary Clark#if USE(ACCELERATED_COMPOSITING)
5666d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    LayerAndroid* compositeLayer = compositeRoot();
5676d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (!compositeLayer)
5686d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return ret;
5696d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    compositeLayer->setExtra(extra);
5705065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    SkRect visible;
5715065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    calcOurContentVisibleRect(&visible);
57287962ce00229855c098ba12cee8d5c015a835289Cary Clark    // call this to be sure we've adjusted for any scrolling or animations
57387962ce00229855c098ba12cee8d5c015a835289Cary Clark    // before we actually draw
5746d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    compositeLayer->updateFixedLayersPositions(visible);
5756d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    compositeLayer->updatePositions();
5766d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    // We have to set the canvas' matrix on the base layer
577e93f34788b1f644f8be61a1daf6505c387e6fc3bNicolas Roard    // (to have fixed layers work as intended)
578e93f34788b1f644f8be61a1daf6505c387e6fc3bNicolas Roard    SkAutoCanvasRestore restore(canvas, true);
5796d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    m_baseLayer->setMatrix(canvas->getTotalMatrix());
580e93f34788b1f644f8be61a1daf6505c387e6fc3bNicolas Roard    canvas->resetMatrix();
5816d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    m_baseLayer->draw(canvas);
5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
5836d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    return ret;
5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
58687962ce00229855c098ba12cee8d5c015a835289Cary Clark
58746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkbool cursorIsTextInput(FrameCachePermission allowNewer)
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
58946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    CachedRoot* root = getFrameCache(allowNewer);
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!root) {
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DBG_NAV_LOG("!root");
5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
59446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedNode* cursor = root->currentCursor();
595f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark    if (!cursor) {
596f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark        DBG_NAV_LOG("!cursor");
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
598f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark    }
5991d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    DBG_NAV_LOGD("%s", cursor->isTextInput() ? "true" : "false");
6001d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    return cursor->isTextInput();
6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
60346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkvoid cursorRingBounds(WebCore::IntRect* bounds)
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DBG_NAV_LOGD("%s", "");
6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedRoot* root = getFrameCache(DontAllowNewer);
6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (root) {
608f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark        const CachedFrame* cachedFrame;
609f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark        const CachedNode* cachedNode = root->currentCursor(&cachedFrame);
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (cachedNode) {
611f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark            *bounds = cachedNode->cursorRingBounds(cachedFrame);
6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            DBG_NAV_LOGD("bounds={%d,%d,%d,%d}", bounds->x(), bounds->y(),
6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                bounds->width(), bounds->height());
6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *bounds = WebCore::IntRect(0, 0, 0, 0);
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62036747fa778285f57f2f53c047028be83e9d8776dCary Clarkvoid fixCursor()
62136747fa778285f57f2f53c047028be83e9d8776dCary Clark{
62236747fa778285f57f2f53c047028be83e9d8776dCary Clark    m_viewImpl->gCursorBoundsMutex.lock();
62336747fa778285f57f2f53c047028be83e9d8776dCary Clark    bool hasCursorBounds = m_viewImpl->m_hasCursorBounds;
62436747fa778285f57f2f53c047028be83e9d8776dCary Clark    IntRect bounds = m_viewImpl->m_cursorBounds;
62536747fa778285f57f2f53c047028be83e9d8776dCary Clark    m_viewImpl->gCursorBoundsMutex.unlock();
62636747fa778285f57f2f53c047028be83e9d8776dCary Clark    if (!hasCursorBounds)
62736747fa778285f57f2f53c047028be83e9d8776dCary Clark        return;
62836747fa778285f57f2f53c047028be83e9d8776dCary Clark    int x, y;
62936747fa778285f57f2f53c047028be83e9d8776dCary Clark    const CachedFrame* frame;
630a34b1107b2542fa334fd4db2d58e2df849e083b0Cary Clark    const CachedNode* node = m_frameCacheUI->findAt(bounds, &frame, &x, &y, true);
63136747fa778285f57f2f53c047028be83e9d8776dCary Clark    if (!node)
63236747fa778285f57f2f53c047028be83e9d8776dCary Clark        return;
63336747fa778285f57f2f53c047028be83e9d8776dCary Clark    // require that node have approximately the same bounds (+/- 4) and the same
63436747fa778285f57f2f53c047028be83e9d8776dCary Clark    // center (+/- 2)
63536747fa778285f57f2f53c047028be83e9d8776dCary Clark    IntPoint oldCenter = IntPoint(bounds.x() + (bounds.width() >> 1),
63636747fa778285f57f2f53c047028be83e9d8776dCary Clark        bounds.y() + (bounds.height() >> 1));
637f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    IntRect newBounds = node->bounds(frame);
63836747fa778285f57f2f53c047028be83e9d8776dCary Clark    IntPoint newCenter = IntPoint(newBounds.x() + (newBounds.width() >> 1),
63936747fa778285f57f2f53c047028be83e9d8776dCary Clark        newBounds.y() + (newBounds.height() >> 1));
64036747fa778285f57f2f53c047028be83e9d8776dCary Clark    DBG_NAV_LOGD("oldCenter=(%d,%d) newCenter=(%d,%d)"
64136747fa778285f57f2f53c047028be83e9d8776dCary Clark        " bounds=(%d,%d,w=%d,h=%d) newBounds=(%d,%d,w=%d,h=%d)",
64236747fa778285f57f2f53c047028be83e9d8776dCary Clark        oldCenter.x(), oldCenter.y(), newCenter.x(), newCenter.y(),
64336747fa778285f57f2f53c047028be83e9d8776dCary Clark        bounds.x(), bounds.y(), bounds.width(), bounds.height(),
64436747fa778285f57f2f53c047028be83e9d8776dCary Clark        newBounds.x(), newBounds.y(), newBounds.width(), newBounds.height());
64536747fa778285f57f2f53c047028be83e9d8776dCary Clark    if (abs(oldCenter.x() - newCenter.x()) > 2)
64636747fa778285f57f2f53c047028be83e9d8776dCary Clark        return;
64736747fa778285f57f2f53c047028be83e9d8776dCary Clark    if (abs(oldCenter.y() - newCenter.y()) > 2)
64836747fa778285f57f2f53c047028be83e9d8776dCary Clark        return;
64936747fa778285f57f2f53c047028be83e9d8776dCary Clark    if (abs(bounds.x() - newBounds.x()) > 4)
65036747fa778285f57f2f53c047028be83e9d8776dCary Clark        return;
65136747fa778285f57f2f53c047028be83e9d8776dCary Clark    if (abs(bounds.y() - newBounds.y()) > 4)
65236747fa778285f57f2f53c047028be83e9d8776dCary Clark        return;
6531ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block    if (abs(bounds.maxX() - newBounds.maxX()) > 4)
65436747fa778285f57f2f53c047028be83e9d8776dCary Clark        return;
6551ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block    if (abs(bounds.maxY() - newBounds.maxY()) > 4)
65636747fa778285f57f2f53c047028be83e9d8776dCary Clark        return;
65736747fa778285f57f2f53c047028be83e9d8776dCary Clark    DBG_NAV_LOGD("node=%p frame=%p x=%d y=%d bounds=(%d,%d,w=%d,h=%d)",
65836747fa778285f57f2f53c047028be83e9d8776dCary Clark        node, frame, x, y, bounds.x(), bounds.y(), bounds.width(),
65936747fa778285f57f2f53c047028be83e9d8776dCary Clark        bounds.height());
66036747fa778285f57f2f53c047028be83e9d8776dCary Clark    m_frameCacheUI->setCursor(const_cast<CachedFrame*>(frame),
66136747fa778285f57f2f53c047028be83e9d8776dCary Clark        const_cast<CachedNode*>(node));
66236747fa778285f57f2f53c047028be83e9d8776dCary Clark}
66336747fa778285f57f2f53c047028be83e9d8776dCary Clark
6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCachedRoot* getFrameCache(FrameCachePermission allowNewer)
6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
66646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    if (!m_viewImpl->m_updatedFrameCache) {
66749e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark        DBG_NAV_LOGV("%s", "!m_viewImpl->m_updatedFrameCache");
6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_frameCacheUI;
66946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    }
67046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    if (allowNewer == DontAllowNewer && m_viewImpl->m_lastGeneration < m_generation) {
67146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        DBG_NAV_LOGD("allowNewer==DontAllowNewer m_viewImpl->m_lastGeneration=%d"
67246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark            " < m_generation=%d", m_viewImpl->m_lastGeneration, m_generation);
6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_frameCacheUI;
67446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    }
6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DBG_NAV_LOGD("%s", "m_viewImpl->m_updatedFrameCache == true");
676f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedFrame* oldCursorFrame;
677f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedNode* oldCursorNode = m_frameCacheUI ?
678f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark        m_frameCacheUI->currentCursor(&oldCursorFrame) : 0;
679f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark#if USE(ACCELERATED_COMPOSITING)
680be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark    int layerId = -1;
681be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark    if (oldCursorNode && oldCursorNode->isInLayer()) {
682be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark        const LayerAndroid* cursorLayer = oldCursorFrame->layer(oldCursorNode)
683be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark            ->layer(m_frameCacheUI->rootLayer());
684be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark        if (cursorLayer)
685be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark            layerId = cursorLayer->uniqueId();
686be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark    }
687f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark#endif
688f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    // get id from old layer and use to find new layer
6893a752d13620eb15148e87a028d66932c74a27993Cary Clark    bool oldFocusIsTextInput = false;
6903a752d13620eb15148e87a028d66932c74a27993Cary Clark    void* oldFocusNodePointer = 0;
6913a752d13620eb15148e87a028d66932c74a27993Cary Clark    if (m_frameCacheUI) {
6923a752d13620eb15148e87a028d66932c74a27993Cary Clark        const CachedNode* oldFocus = m_frameCacheUI->currentFocus();
6933a752d13620eb15148e87a028d66932c74a27993Cary Clark        if (oldFocus) {
6943a752d13620eb15148e87a028d66932c74a27993Cary Clark            oldFocusIsTextInput = oldFocus->isTextInput();
6953a752d13620eb15148e87a028d66932c74a27993Cary Clark            oldFocusNodePointer = oldFocus->nodePointer();
6963a752d13620eb15148e87a028d66932c74a27993Cary Clark        }
6973a752d13620eb15148e87a028d66932c74a27993Cary Clark    }
6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewImpl->gFrameCacheMutex.lock();
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete m_frameCacheUI;
700b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger    SkSafeUnref(m_navPictureUI);
7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewImpl->m_updatedFrameCache = false;
7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frameCacheUI = m_viewImpl->m_frameCacheKit;
7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_navPictureUI = m_viewImpl->m_navPictureKit;
7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewImpl->m_frameCacheKit = 0;
7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewImpl->m_navPictureKit = 0;
7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewImpl->gFrameCacheMutex.unlock();
707f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    if (m_frameCacheUI)
7086d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        m_frameCacheUI->setRootLayer(compositeRoot());
709f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark#if USE(ACCELERATED_COMPOSITING)
710f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    if (layerId >= 0) {
7115065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark        SkRect visible;
7125065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark        calcOurContentVisibleRect(&visible);
713f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark        LayerAndroid* layer = const_cast<LayerAndroid*>(
714cdd7f6d80774ba3a374f09f22f7cb6bcfca24fa5Mike Reed                                                m_frameCacheUI->rootLayer());
715cdd7f6d80774ba3a374f09f22f7cb6bcfca24fa5Mike Reed        if (layer) {
716fa26a8dd531dff44d6cad0700ff32c0bb949392cNicolas Roard            layer->updateFixedLayersPositions(visible);
717fa26a8dd531dff44d6cad0700ff32c0bb949392cNicolas Roard            layer->updatePositions();
718cdd7f6d80774ba3a374f09f22f7cb6bcfca24fa5Mike Reed        }
719f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    }
720f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark#endif
72136747fa778285f57f2f53c047028be83e9d8776dCary Clark    fixCursor();
7223a752d13620eb15148e87a028d66932c74a27993Cary Clark    if (oldFocusIsTextInput) {
72395fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins        const CachedNode* newFocus = m_frameCacheUI->currentFocus();
7243a752d13620eb15148e87a028d66932c74a27993Cary Clark        if (newFocus && oldFocusNodePointer != newFocus->nodePointer()
7253a752d13620eb15148e87a028d66932c74a27993Cary Clark                && newFocus->isTextInput()
72695fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins                && newFocus != m_frameCacheUI->currentCursor()) {
72795fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins            // The focus has changed.  We may need to update things.
72895fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins            LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
72995fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins            JNIEnv* env = JSC::Bindings::getJNIEnv();
730b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block            AutoJObject javaObject = m_javaGlue.object(env);
731b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block            if (javaObject.get()) {
732b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block                env->CallVoidMethod(javaObject.get(), m_javaGlue.m_domChangedFocus);
733b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block                checkException(env);
734b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block            }
73595fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins        }
73695fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins    }
737f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    if (oldCursorNode && (!m_frameCacheUI || !m_frameCacheUI->currentCursor()))
73846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        viewInvalidate(); // redraw in case cursor ring is still visible
7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_frameCacheUI;
7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint getScaledMaxXScroll()
7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
746b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
747b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
748b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return 0;
749b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    int result = env->CallIntMethod(javaObject.get(), m_javaGlue.m_getScaledMaxXScroll);
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint getScaledMaxYScroll()
7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
758b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
759b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
760b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return 0;
761b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    int result = env->CallIntMethod(javaObject.get(), m_javaGlue.m_getScaledMaxYScroll);
7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
766af03a3d6830584ef606be2d1c64845815dadb146Cary ClarkIntRect getVisibleRect()
7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
768af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    IntRect rect;
7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
771b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
772b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
773b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return rect;
774b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    jobject jRect = env->CallObjectMethod(javaObject.get(), m_javaGlue.m_getVisibleRect);
7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
776af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    rect.setX(env->GetIntField(jRect, m_javaGlue.m_rectLeft));
7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
778af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    rect.setY(env->GetIntField(jRect, m_javaGlue.m_rectTop));
7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
780af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    rect.setWidth(env->CallIntMethod(jRect, m_javaGlue.m_rectWidth));
7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
782af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    rect.setHeight(env->CallIntMethod(jRect, m_javaGlue.m_rectHeight));
7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    env->DeleteLocalRef(jRect);
7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
786af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    return rect;
7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
789652e9a017a7c5c772361bf57279fae0c26992329Jeff Brownstatic CachedFrame::Direction KeyToDirection(int32_t keyCode)
7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (keyCode) {
792652e9a017a7c5c772361bf57279fae0c26992329Jeff Brown        case AKEYCODE_DPAD_RIGHT:
7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            DBG_NAV_LOGD("keyCode=%s", "right");
7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return CachedFrame::RIGHT;
795652e9a017a7c5c772361bf57279fae0c26992329Jeff Brown        case AKEYCODE_DPAD_LEFT:
7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            DBG_NAV_LOGD("keyCode=%s", "left");
7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return CachedFrame::LEFT;
798652e9a017a7c5c772361bf57279fae0c26992329Jeff Brown        case AKEYCODE_DPAD_DOWN:
7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            DBG_NAV_LOGD("keyCode=%s", "down");
8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return CachedFrame::DOWN;
801652e9a017a7c5c772361bf57279fae0c26992329Jeff Brown        case AKEYCODE_DPAD_UP:
8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            DBG_NAV_LOGD("keyCode=%s", "up");
8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return CachedFrame::UP;
8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
805b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark            DBG_NAV_LOGD("bad key %d sent", keyCode);
8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return CachedFrame::UNINITIALIZED;
8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
81045b64f60af3cbfa8c78388e35e9b669a0c284bdcBen MurdochWTF::String imageURI(int x, int y)
8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CachedRoot* root = getFrameCache(DontAllowNewer);
81345b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch    return root ? root->imageURI(x, y) : WTF::String();
8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
816f4669cac3858848a9247e801b6106aeae6d406e8Cary Clarkbool cursorWantsKeyEvents()
8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CachedRoot* root = getFrameCache(DontAllowNewer);
8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (root) {
820f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark        const CachedNode* focus = root->currentCursor();
82146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        if (focus)
822f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark            return focus->wantsKeyEvents();
8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
8258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
82769bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins
82846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark/* returns true if the key had no effect (neither scrolled nor changed cursor) */
8294ca8bc94f71466d1109bfbb9ef00da3256a0899bCary Clarkbool moveCursor(int keyCode, int count, bool ignoreScroll)
8308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedRoot* root = getFrameCache(AllowNewer);
8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!root) {
8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DBG_NAV_LOG("!root");
8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
83746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    m_viewImpl->m_moveGeneration++;
838652e9a017a7c5c772361bf57279fae0c26992329Jeff Brown    CachedFrame::Direction direction = KeyToDirection(keyCode);
8398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CachedFrame* cachedFrame, * oldFrame = 0;
84046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedNode* cursor = root->currentCursor(&oldFrame);
84146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    WebCore::IntPoint cursorLocation = root->cursorLocation();
84246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    DBG_NAV_LOGD("old cursor %d (nativeNode=%p) cursorLocation={%d, %d}",
84346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        cursor ? cursor->index() : 0,
84446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        cursor ? cursor->nodePointer() : 0, cursorLocation.x(), cursorLocation.y());
845f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    WebCore::IntRect visibleRect = setVisibleRect(root);
8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int xMax = getScaledMaxXScroll();
8478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int yMax = getScaledMaxYScroll();
8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    root->setMaxScroll(xMax, yMax);
8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CachedNode* cachedNode = 0;
8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int dx = 0;
8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int dy = 0;
8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int counter = count;
8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (--counter >= 0) {
8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebCore::IntPoint scroll = WebCore::IntPoint(0, 0);
85546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        cachedNode = root->moveCursor(direction, &cachedFrame, &scroll);
8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        dx += scroll.x();
8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        dy += scroll.y();
8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
85946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    DBG_NAV_LOGD("new cursor %d (nativeNode=%p) cursorLocation={%d, %d}"
86046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        "bounds={%d,%d,w=%d,h=%d}", cachedNode ? cachedNode->index() : 0,
86146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        cachedNode ? cachedNode->nodePointer() : 0,
86246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark            root->cursorLocation().x(), root->cursorLocation().y(),
863f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark            cachedNode ? cachedNode->bounds(cachedFrame).x() : 0,
864f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark            cachedNode ? cachedNode->bounds(cachedFrame).y() : 0,
865f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark            cachedNode ? cachedNode->bounds(cachedFrame).width() : 0,
866f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark            cachedNode ? cachedNode->bounds(cachedFrame).height() : 0);
8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If !m_heightCanMeasure (such as in the browser), we want to scroll no
8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // matter what
8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!ignoreScroll && (!m_heightCanMeasure ||
8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            !cachedNode ||
87146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark            (cursor && cursor->nodePointer() == cachedNode->nodePointer())))
8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (count == 1 && dx != 0 && dy == 0 && -m_lastDx == dx &&
8748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                SkTime::GetMSecs() - m_lastDxTime < 1000)
8758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            root->checkForJiggle(&dx);
8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DBG_NAV_LOGD("scrollBy %d,%d", dx, dy);
8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ((dx | dy))
8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            this->scrollBy(dx, dy);
8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_lastDx = dx;
8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_lastDxTime = SkTime::GetMSecs();
8818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool result = false;
8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (cachedNode) {
88432dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark        showCursorUntimed();
88587962ce00229855c098ba12cee8d5c015a835289Cary Clark        m_viewImpl->updateCursorBounds(root, cachedFrame, cachedNode);
88690bd422df8e04c486d29c4041acf1c4cf7c3b155Leon Scroggins        root->setCursor(const_cast<CachedFrame*>(cachedFrame),
88790bd422df8e04c486d29c4041acf1c4cf7c3b155Leon Scroggins                const_cast<CachedNode*>(cachedNode));
8884ba38126aa5964cd2e1922f3234c745032b5db59Leon Scroggins        const CachedNode* focus = root->currentFocus();
8890a506c68f4ad915ee62e7bf4f22f58b24d078d56Leon Scroggins        bool clearTextEntry = cachedNode != focus && focus
8900a506c68f4ad915ee62e7bf4f22f58b24d078d56Leon Scroggins                && cachedNode->nodePointer() != focus->nodePointer() && focus->isTextInput();
89194f12574c74b11db011b994e462f64a112952a47Leon Scroggins        // Stop painting the caret if the old focus was a text input and so is the new cursor.
89294f12574c74b11db011b994e462f64a112952a47Leon Scroggins        bool stopPaintingCaret = clearTextEntry && cachedNode->wantsKeyEvents();
89394f12574c74b11db011b994e462f64a112952a47Leon Scroggins        sendMoveMouseIfLatest(clearTextEntry, stopPaintingCaret);
8948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
8958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int docHeight = root->documentHeight();
8968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int docWidth = root->documentWidth();
8971ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block        if (visibleRect.maxY() + dy > docHeight)
8981ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block            dy = docHeight - visibleRect.maxY();
8998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (visibleRect.y() + dy < 0)
9008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            dy = -visibleRect.y();
9011ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block        if (visibleRect.maxX() + dx > docWidth)
9021ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block            dx = docWidth - visibleRect.maxX();
9038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (visibleRect.x() < 0)
9048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            dx = -visibleRect.x();
9058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = direction == CachedFrame::LEFT ? dx >= 0 :
9068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            direction == CachedFrame::RIGHT ? dx <= 0 :
9078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            direction == CachedFrame::UP ? dy >= 0 : dy <= 0;
9088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid notifyProgressFinished()
9138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
91446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    DBG_NAV_LOGD("cursorIsTextInput=%d", cursorIsTextInput(DontAllowNewer));
91595fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins    rebuildWebTextView();
9168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if DEBUG_NAV_UI
9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_frameCacheUI) {
9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const CachedNode* focus = m_frameCacheUI->currentFocus();
9198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DBG_NAV_LOGD("focus %d (nativeNode=%p)",
9208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            focus ? focus->index() : 0,
9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            focus ? focus->nodePointer() : 0);
9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
9248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst CachedNode* findAt(CachedRoot* root, const WebCore::IntRect& rect,
9278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CachedFrame** framePtr, int* rxPtr, int* ryPtr)
9288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *rxPtr = 0;
9308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *ryPtr = 0;
9318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *framePtr = 0;
9328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!root)
9338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
934f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    setVisibleRect(root);
935f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    return root->findAt(rect, framePtr, rxPtr, ryPtr, true);
936f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark}
937f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark
938f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary ClarkIntRect setVisibleRect(CachedRoot* root)
939f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{
940af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    IntRect visibleRect = getVisibleRect();
941f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    DBG_NAV_LOGD("getVisibleRect %d,%d,%d,%d",
942f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark        visibleRect.x(), visibleRect.y(), visibleRect.width(), visibleRect.height());
9438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    root->setVisibleRect(visibleRect);
944f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    return visibleRect;
9458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid selectBestAt(const WebCore::IntRect& rect)
9488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CachedFrame* frame;
9508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int rx, ry;
951f1610d01f92cb77827d2de13c0ed38554e4f0790Cary Clark    CachedRoot* root = getFrameCache(AllowNewer);
952f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    if (!root)
953f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        return;
9548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CachedNode* node = findAt(root, rect, &frame, &rx, &ry);
9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!node) {
9568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DBG_NAV_LOGD("no nodes found root=%p", root);
957fb934b7878723bd752b558aee4047f9aee19405eTeng-Hui Zhu        root->rootHistory()->setMouseBounds(rect);
95869bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins        m_viewImpl->m_hasCursorBounds = false;
959b41f6483040a4269f2761648f5fa528ca602df5dCary Clark        root->setCursor(0, 0);
96032dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark        viewInvalidate();
96146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    } else {
96246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        DBG_NAV_LOGD("CachedNode:%p (%d)", node, node->index());
963ef1adcdfc805d4d13103f6f15cc5b4d96828a60fPatrick Scott        WebCore::IntRect bounds = node->bounds(frame);
964b0c9a2b4033eca931163e8223d7eaa8889337144Patrick Scott        root->rootHistory()->setMouseBounds(bounds);
96587962ce00229855c098ba12cee8d5c015a835289Cary Clark        m_viewImpl->updateCursorBounds(root, frame, node);
96632dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark        showCursorTimed();
96746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        root->setCursor(const_cast<CachedFrame*>(frame),
96890bd422df8e04c486d29c4041acf1c4cf7c3b155Leon Scroggins                const_cast<CachedNode*>(node));
9698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
97094f12574c74b11db011b994e462f64a112952a47Leon Scroggins    sendMoveMouseIfLatest(false, false);
9718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
973d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkconst CachedNode* m_cacheHitNode;
974d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkconst CachedFrame* m_cacheHitFrame;
975d4924af12855cd19162ba1442a6055664c98ca32Cary Clark
976d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkbool pointInNavCache(int x, int y, int slop)
977d4924af12855cd19162ba1442a6055664c98ca32Cary Clark{
978d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    CachedRoot* root = getFrameCache(AllowNewer);
979d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    if (!root)
980d4924af12855cd19162ba1442a6055664c98ca32Cary Clark        return false;
981d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    IntRect rect = IntRect(x - slop, y - slop, slop * 2, slop * 2);
982d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    int rx, ry;
983d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    return (m_cacheHitNode = findAt(root, rect, &m_cacheHitFrame, &rx, &ry));
984d4924af12855cd19162ba1442a6055664c98ca32Cary Clark}
985d4924af12855cd19162ba1442a6055664c98ca32Cary Clark
98646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkbool motionUp(int x, int y, int slop)
9878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool pageScrolled = false;
989d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    IntRect rect = IntRect(x - slop, y - slop, slop * 2, slop * 2);
9908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int rx, ry;
9918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedRoot* root = getFrameCache(AllowNewer);
99273d131bc28aa2a68fe686ffd9426814448f5da7bCary Clark    if (!root)
993d4924af12855cd19162ba1442a6055664c98ca32Cary Clark        return 0;
994d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    const CachedFrame* frame = 0;
995af3b7507bd6d2b10fce43aa0728b8afcf5cddd86Cary Clark    const CachedNode* result = findAt(root, rect, &frame, &rx, &ry);
996ec079933211eb47479b2624cb6be72257d178c01Cary Clark    CachedHistory* history = root->rootHistory();
9978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!result) {
9988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DBG_NAV_LOGD("no nodes found root=%p", root);
999ec079933211eb47479b2624cb6be72257d178c01Cary Clark        history->setNavBounds(rect);
100069bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins        m_viewImpl->m_hasCursorBounds = false;
100169bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins        root->hideCursor();
100269bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins        int dx = root->checkForCenter(x, y);
100369bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins        if (dx) {
100469bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins            scrollBy(dx, 0);
100569bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins            pageScrolled = true;
10068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
100746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        sendMotionUp(frame ? (WebCore::Frame*) frame->framePointer() : 0,
1008ee260612d8744993644f2e0b0f1fed51423be6dbLeon Scroggins            0, x, y);
100946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        viewInvalidate();
10108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return pageScrolled;
10118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
10128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DBG_NAV_LOGD("CachedNode:%p (%d) x=%d y=%d rx=%d ry=%d", result,
10138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result->index(), x, y, rx, ry);
101415f1e443f22288ee82cde972517ebf3cc1153d97Leon Scroggins    WebCore::IntRect navBounds = WebCore::IntRect(rx, ry, 1, 1);
1015ec079933211eb47479b2624cb6be72257d178c01Cary Clark    history->setNavBounds(navBounds);
1016ec079933211eb47479b2624cb6be72257d178c01Cary Clark    history->setMouseBounds(navBounds);
101787962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_viewImpl->updateCursorBounds(root, frame, result);
101846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    root->setCursor(const_cast<CachedFrame*>(frame),
10198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const_cast<CachedNode*>(result));
102032dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    if (result->isSyntheticLink())
102132dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark        overrideUrlLoading(result->getExport());
102232dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    else {
102346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        sendMotionUp(
102434bca311c8205ee40379adac2ef4da01e401600eCary Clark            (WebCore::Frame*) frame->framePointer(),
1025ee260612d8744993644f2e0b0f1fed51423be6dbLeon Scroggins            (WebCore::Node*) result->nodePointer(), rx, ry);
102646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    }
102732dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    if (result->isTextInput() || result->isSelect()
102832dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark            || result->isContentEditable()) {
102932dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark        showCursorUntimed();
103032dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    } else
103132dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark        showCursorTimed();
10328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return pageScrolled;
10338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
103582f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if USE(ACCELERATED_COMPOSITING)
1036f81c672a4f5c06621000a6df0984cde689397d94Cary Clarkstatic const ScrollableLayerAndroid* findScrollableLayer(
1037f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    const LayerAndroid* parent, int x, int y, SkIRect* foundBounds) {
103882f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    SkRect bounds;
103982f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    parent->bounds(&bounds);
104082f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    // Check the parent bounds first; this will clip to within a masking layer's
104182f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    // bounds.
1042fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott    if (parent->masksToBounds() && !bounds.contains(x, y))
104382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott        return 0;
104482f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    // Move the hit test local to parent.
104582f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    x -= bounds.fLeft;
104682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    y -= bounds.fTop;
104782f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    int count = parent->countChildren();
10481a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott    while (count--) {
10491a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott        const LayerAndroid* child = parent->getChild(count);
1050f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        const ScrollableLayerAndroid* result = findScrollableLayer(child, x, y,
1051f81c672a4f5c06621000a6df0984cde689397d94Cary Clark            foundBounds);
1052f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        if (result) {
1053f81c672a4f5c06621000a6df0984cde689397d94Cary Clark            foundBounds->offset(bounds.fLeft, bounds.fTop);
1054f81c672a4f5c06621000a6df0984cde689397d94Cary Clark            if (parent->masksToBounds()) {
1055f81c672a4f5c06621000a6df0984cde689397d94Cary Clark                if (bounds.width() < foundBounds->width())
1056f81c672a4f5c06621000a6df0984cde689397d94Cary Clark                    foundBounds->fRight = foundBounds->fLeft + bounds.width();
1057f81c672a4f5c06621000a6df0984cde689397d94Cary Clark                if (bounds.height() < foundBounds->height())
1058f81c672a4f5c06621000a6df0984cde689397d94Cary Clark                    foundBounds->fBottom = foundBounds->fTop + bounds.height();
1059f81c672a4f5c06621000a6df0984cde689397d94Cary Clark            }
106082f247bdbb98dd80c44209d87692c650c3704617Patrick Scott            return result;
1061f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        }
106282f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    }
1063f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    if (parent->contentIsScrollable()) {
1064f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        foundBounds->set(0, 0, bounds.width(), bounds.height());
1065fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott        return static_cast<const ScrollableLayerAndroid*>(parent);
1066f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    }
106782f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    return 0;
106882f247bdbb98dd80c44209d87692c650c3704617Patrick Scott}
106982f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif
107082f247bdbb98dd80c44209d87692c650c3704617Patrick Scott
1071f81c672a4f5c06621000a6df0984cde689397d94Cary Clarkint scrollableLayer(int x, int y, SkIRect* layerRect, SkIRect* bounds)
1072a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{
107382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if USE(ACCELERATED_COMPOSITING)
1074af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    const LayerAndroid* layerRoot = compositeRoot();
1075af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    if (!layerRoot)
1076a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        return 0;
1077f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    const ScrollableLayerAndroid* result = findScrollableLayer(layerRoot, x, y,
1078f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        bounds);
107922e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott    if (result) {
108022e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott        result->getScrollRect(layerRect);
10818598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott        return result->uniqueId();
108222e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott    }
1083a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#endif
1084a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    return 0;
1085a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott}
1086a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott
1087fa768f11d82c34980cce020f442329299efb08caCary Clarkint getBlockLeftEdge(int x, int y, float scale)
1088a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba{
1089a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba    CachedRoot* root = getFrameCache(AllowNewer);
1090a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba    if (root)
1091fa768f11d82c34980cce020f442329299efb08caCary Clark        return root->getBlockLeftEdge(x, y, scale);
1092a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba    return -1;
1093a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba}
1094a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba
109545b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdochvoid overrideUrlLoading(const WTF::String& url)
10968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
1098b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
1099b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
1100b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
110179b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block    jstring jName = wtfStringToJstring(env, url);
1102b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_overrideLoading, jName);
11038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    env->DeleteLocalRef(jName);
11048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid setFindIsUp(bool up)
11078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1108afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    DBG_NAV_LOGD("up=%d", up);
11098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewImpl->m_findIsUp = up;
1110afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark}
1111afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark
1112afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clarkvoid setFindIsEmpty()
1113afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark{
1114afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    DBG_NAV_LOG("");
1115afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    m_findOnPage.clearCurrentLocation();
11168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
111832dffb883f56b18019afa7a01b2564b993b3fe8eCary Clarkvoid showCursorTimed()
11198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
112032dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    DBG_NAV_LOG("");
112132dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    m_ringAnimationEnd = SkTime::GetMSecs() + 500;
112232dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    viewInvalidate();
112332dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark}
112432dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark
112532dffb883f56b18019afa7a01b2564b993b3fe8eCary Clarkvoid showCursorUntimed()
112632dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark{
112732dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    DBG_NAV_LOG("");
11287a69d7c255012f3fcc4d9af040600eac1b2e5c56Cary Clark    m_ring.m_isPressed = false;
112932dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    m_ringAnimationEnd = UINT_MAX;
113032dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    viewInvalidate();
11318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid setHeightCanMeasure(bool measure)
11348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
11358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_heightCanMeasure = measure;
11368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
113887962ce00229855c098ba12cee8d5c015a835289Cary ClarkString getSelection()
11398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
114087962ce00229855c098ba12cee8d5c015a835289Cary Clark    return m_selectText.getSelection();
11418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1143a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkvoid moveSelection(int x, int y)
11448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1145af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    m_selectText.moveSelection(getVisibleRect(), x, y);
11468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1148515943cc7c9a60faa661739271d5fa14fcba9df8Cary ClarkIntPoint selectableText()
1149515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark{
1150515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    const CachedRoot* root = getFrameCache(DontAllowNewer);
1151515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    if (!root)
1152515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark        return IntPoint(0, 0);
1153515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    return m_selectText.selectableText(root);
1154515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark}
1155515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark
1156a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkvoid selectAll()
1157a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
1158af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    m_selectText.selectAll();
1159a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1160a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1161a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkint selectionX()
1162a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
1163a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return m_selectText.selectionX();
1164a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1165a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1166a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkint selectionY()
1167a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
1168a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return m_selectText.selectionY();
1169a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1170a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1171a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkvoid resetSelection()
1172a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
1173a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    m_selectText.reset();
1174a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1175a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1176a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkbool startSelection(int x, int y)
1177a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
1178af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    const CachedRoot* root = getFrameCache(DontAllowNewer);
1179af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    if (!root)
1180af03a3d6830584ef606be2d1c64845815dadb146Cary Clark        return false;
1181af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    return m_selectText.startSelection(root, getVisibleRect(), x, y);
1182a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1183a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1184a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkbool wordSelection(int x, int y)
1185a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
11869432ba4878ebf79acd4424398b344c154f452db2Cary Clark    const CachedRoot* root = getFrameCache(DontAllowNewer);
11879432ba4878ebf79acd4424398b344c154f452db2Cary Clark    if (!root)
1188a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        return false;
11899432ba4878ebf79acd4424398b344c154f452db2Cary Clark    return m_selectText.wordSelection(root, getVisibleRect(), x, y);
1190a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1191a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1192a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkbool extendSelection(int x, int y)
1193a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
1194af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    m_selectText.extendSelection(getVisibleRect(), x, y);
1195a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return true;
1196a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1197a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1198a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkbool hitSelection(int x, int y)
1199a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
1200a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return m_selectText.hitSelection(x, y);
1201a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1202a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1203a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkvoid setExtendSelection()
1204a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
1205a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    m_selectText.setExtendSelection(true);
1206a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1207a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1208a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkvoid setSelectionPointer(bool set, float scale, int x, int y)
12098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
121087962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_selectText.setDrawPointer(set);
121187962ce00229855c098ba12cee8d5c015a835289Cary Clark    if (!set)
121287962ce00229855c098ba12cee8d5c015a835289Cary Clark        return;
121387962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_selectText.m_inverseScale = scale;
121487962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_selectText.m_selectX = x;
121587962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_selectText.m_selectY = y;
12168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1218bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scrogginsvoid sendMoveFocus(WebCore::Frame* framePtr, WebCore::Node* nodePtr)
1219bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins{
12205e5962825729a211e093fd615ddc9e5b0bec10bdCary Clark    DBG_NAV_LOGD("framePtr=%p nodePtr=%p", framePtr, nodePtr);
1221bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins    JNIEnv* env = JSC::Bindings::getJNIEnv();
1222b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
1223b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
1224b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
1225b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_sendMoveFocus, (jint) framePtr, (jint) nodePtr);
1226bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins    checkException(env);
1227bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins}
1228bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins
122946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkvoid sendMoveMouse(WebCore::Frame* framePtr, WebCore::Node* nodePtr, int x, int y)
12308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DBG_NAV_LOGD("framePtr=%p nodePtr=%p x=%d y=%d", framePtr, nodePtr, x, y);
12328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
1233b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
1234b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
1235b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
1236b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_sendMoveMouse, reinterpret_cast<jint>(framePtr), reinterpret_cast<jint>(nodePtr), x, y);
12378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
12388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
124094f12574c74b11db011b994e462f64a112952a47Leon Scrogginsvoid sendMoveMouseIfLatest(bool clearTextEntry, bool stopPaintingCaret)
12418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
12438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
1244b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
1245b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
1246b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
1247b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_sendMoveMouseIfLatest, clearTextEntry, stopPaintingCaret);
12488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
12498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1251b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Blockvoid sendMotionUp(WebCore::Frame* framePtr, WebCore::Node* nodePtr, int x, int y)
12528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1253b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    DBG_NAV_LOGD("m_generation=%d framePtr=%p nodePtr=%p x=%d y=%d", m_generation, framePtr, nodePtr, x, y);
12548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(m_javaGlue.m_obj, "A WebView was not associated with this WebViewNative!");
1255b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block
12568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
1257b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
1258b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
1259b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
1260b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    m_viewImpl->m_touchGeneration = ++m_generation;
1261b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_sendMotionUp, m_generation, (jint) framePtr, (jint) nodePtr, x, y);
12628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
12638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid findNext(bool forward)
12668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1267f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    m_findOnPage.findNext(forward);
12685065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    if (!m_findOnPage.currentMatchIsInLayer())
12695065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark        scrollRectOnScreen(m_findOnPage.currentMatchBounds());
12708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    viewInvalidate();
12718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// With this call, WebView takes ownership of matches, and is responsible for
12748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// deleting it.
1275db17cf1782eab2488aab0933add6c79b21639c08Leon Scrogginsvoid setMatches(WTF::Vector<MatchInfo>* matches, jboolean sameAsLastSearch)
1276db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins{
1277db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    // If this search is the same as the last one, check against the old
1278db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    // location to determine whether to scroll.  If the same word is found
1279db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    // in the same place, then do not scroll.
1280db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    IntRect oldLocation;
1281db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    bool checkAgainstOldLocation;
1282db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    if (sameAsLastSearch && m_findOnPage.isCurrentLocationValid()) {
1283db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins        oldLocation = m_findOnPage.currentMatchBounds();
1284db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins        checkAgainstOldLocation = true;
1285db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    } else
1286db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins        checkAgainstOldLocation = false;
1287db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins
1288f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    m_findOnPage.setMatches(matches);
1289db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins
1290db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    if (!checkAgainstOldLocation
1291db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins            || oldLocation != m_findOnPage.currentMatchBounds()) {
1292db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins        // FIXME: Need to scroll if the match is in a layer.
1293db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins        if (!m_findOnPage.currentMatchIsInLayer())
1294db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins            scrollRectOnScreen(m_findOnPage.currentMatchBounds());
1295db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    }
12968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    viewInvalidate();
12978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1299afbc0998ef990403a8e17efb9a384a46707a328eLeon Scrogginsint currentMatchIndex()
1300afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins{
1301afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins    return m_findOnPage.currentMatchIndex();
1302afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins}
1303afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins
130451c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scrogginsbool scrollBy(int dx, int dy)
13058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
13078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
1309b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
1310b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
1311b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return false;
1312b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    bool result = env->CallBooleanMethod(javaObject.get(), m_javaGlue.m_scrollBy, dx, dy, true);
13138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
131451c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins    return result;
13158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
131746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkbool hasCursorNode()
13188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedRoot* root = getFrameCache(DontAllowNewer);
13208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!root) {
13218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DBG_NAV_LOG("!root");
13228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
13238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
132446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedNode* cursorNode = root->currentCursor();
132546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    DBG_NAV_LOGD("cursorNode=%d (nodePointer=%p)",
132646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        cursorNode ? cursorNode->index() : -1,
132746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        cursorNode ? cursorNode->nodePointer() : 0);
132846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return cursorNode;
132946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
133046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
133146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkbool hasFocusNode()
133246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
133346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    CachedRoot* root = getFrameCache(DontAllowNewer);
133446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    if (!root) {
133546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        DBG_NAV_LOG("!root");
13368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
13378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
133846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedNode* focusNode = root->currentFocus();
133946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    DBG_NAV_LOGD("focusNode=%d (nodePointer=%p)",
134046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        focusNode ? focusNode->index() : -1,
134146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        focusNode ? focusNode->nodePointer() : 0);
134246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return focusNode;
13438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
134595fa6e99128685c55e9be6f4362e67c288482a74Leon Scrogginsvoid rebuildWebTextView()
13468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
1348b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
1349b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
1350b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
1351b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_rebuildWebTextView);
13528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
13538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid viewInvalidate()
13568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
1358b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
1359b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
1360b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
1361b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_viewInvalidate);
13628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
13638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid viewInvalidateRect(int l, int t, int r, int b)
13668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
1368b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
1369b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
1370b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
1371b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_viewInvalidateRect, l, r, t, b);
13728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
13738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid postInvalidateDelayed(int64_t delay, const WebCore::IntRect& bounds)
13768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
1378b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
1379b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
1380b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
1381b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_postInvalidateDelayed,
13821ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block        delay, bounds.x(), bounds.y(), bounds.maxX(), bounds.maxY());
13838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
13848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13863deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenbergerbool inFullScreenMode()
13873deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger{
13883deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger    JNIEnv* env = JSC::Bindings::getJNIEnv();
1389b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
1390b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
1391b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return false;
1392b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    jboolean result = env->CallBooleanMethod(javaObject.get(), m_javaGlue.m_inFullScreenMode);
13933deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger    checkException(env);
13943deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger    return result;
13953deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger}
13963deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger
139746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkint moveGeneration()
139846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
139946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return m_viewImpl->m_moveGeneration;
140046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
140146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
14026d43b9ceb777071c088fe12ee94af80e34816bcfGrace KlobaLayerAndroid* compositeRoot() const
1403f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{
14046d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    LOG_ASSERT(!m_baseLayer || m_baseLayer->countChildren() == 1,
14056d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba            "base layer can't have more than one child %s", __FUNCTION__);
14066d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (m_baseLayer && m_baseLayer->countChildren() == 1)
14076d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return static_cast<LayerAndroid*>(m_baseLayer->getChild(0));
14086d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    else
14096d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return 0;
1410f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark}
1411f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark
141282f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL)
1413a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scottstatic void copyScrollPositionRecursive(const LayerAndroid* from,
1414a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott                                        LayerAndroid* root)
1415a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{
1416a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    if (!from || !root)
1417a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        return;
1418a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    for (int i = 0; i < from->countChildren(); i++) {
1419a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        const LayerAndroid* l = from->getChild(i);
1420a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        if (l->contentIsScrollable()) {
142182f247bdbb98dd80c44209d87692c650c3704617Patrick Scott            const SkPoint& pos = l->getPosition();
142282f247bdbb98dd80c44209d87692c650c3704617Patrick Scott            LayerAndroid* match = root->findById(l->uniqueId());
142382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott            if (match && match->contentIsScrollable())
142482f247bdbb98dd80c44209d87692c650c3704617Patrick Scott                match->setPosition(pos.fX, pos.fY);
1425a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        }
1426a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        copyScrollPositionRecursive(l, root);
1427a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    }
1428a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott}
142982f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif
1430a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott
14316a3bd3f2b6b5a5c80e5fc1674550456b67e2cc7cShimeng (Simon) Wangvoid setBaseLayer(BaseLayerAndroid* layer, SkRegion& inval, bool showVisualIndicator,
14326a3bd3f2b6b5a5c80e5fc1674550456b67e2cc7cShimeng (Simon) Wang                  bool isPictureAfterFirstLayout)
1433f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{
1434a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
1435c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    if (m_glWebViewState)
14366a3bd3f2b6b5a5c80e5fc1674550456b67e2cc7cShimeng (Simon) Wang        m_glWebViewState->setBaseLayer(layer, inval, showVisualIndicator,
14376a3bd3f2b6b5a5c80e5fc1674550456b67e2cc7cShimeng (Simon) Wang                                       isPictureAfterFirstLayout);
1438a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
1439a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
144082f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL)
1441cf6e10e145f44cab3eb70f3782b51a92cf61ae7dShimeng (Simon) Wang    if (layer) {
144282f247bdbb98dd80c44209d87692c650c3704617Patrick Scott        LayerAndroid* newCompositeRoot = static_cast<LayerAndroid*>(layer->getChild(0));
144382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott        copyScrollPositionRecursive(compositeRoot(), newCompositeRoot);
1444cf6e10e145f44cab3eb70f3782b51a92cf61ae7dShimeng (Simon) Wang    }
144582f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif
1446b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger    SkSafeUnref(m_baseLayer);
14476d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    m_baseLayer = layer;
1448f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    CachedRoot* root = getFrameCache(DontAllowNewer);
1449f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    if (!root)
1450f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark        return;
1451f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    root->resetLayers();
14526d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    root->setRootLayer(compositeRoot());
14536d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
14546d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
14556d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobavoid replaceBaseContent(PictureSet* set)
14566d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
14576d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (!m_baseLayer)
14586d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return;
14596d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    m_baseLayer->setContent(*set);
14606d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    delete set;
14616d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
14626d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
14636d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobavoid copyBaseContentToPicture(SkPicture* picture)
14646d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
14656d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (!m_baseLayer)
14666d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return;
14676d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    PictureSet* content = m_baseLayer->content();
1468e59ed3e2c930c8eeed844aa0365e8285d956a8f2Nicolas Roard    m_baseLayer->drawCanvas(picture->beginRecording(content->width(), content->height(),
14696d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba            SkPicture::kUsePathBoundsForClip_RecordingFlag));
14706d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    picture->endRecording();
14716d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
14726d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
14736d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobabool hasContent() {
14746d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (!m_baseLayer)
14756d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return false;
14766d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    return !m_baseLayer->content()->isEmpty();
1477f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark}
1478f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark
1479908703e420f4931f74527aaeb3d5faabdd66c28aChet Haasevoid setFunctor(Functor* functor) {
1480908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    delete m_glDrawFunctor;
1481908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    m_glDrawFunctor = functor;
1482908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}
1483908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
1484908703e420f4931f74527aaeb3d5faabdd66c28aChet HaaseFunctor* getFunctor() {
1485908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    return m_glDrawFunctor;
1486908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}
1487908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
14884212fae38ffee2bbb657dd19e4ae8b7c735f4953John ReckBaseLayerAndroid* getBaseLayer() {
14894212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck    return m_baseLayer;
14904212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck}
14914212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck
14928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate: // local state for WebView
14938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // private to getFrameCache(); other functions operate in a different thread
14948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedRoot* m_frameCacheUI; // navigation data ready for use
14958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebViewCore* m_viewImpl;
14968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int m_generation; // associate unique ID with sent kit focus to match with ui
14978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkPicture* m_navPictureUI;
14988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkMSec m_ringAnimationEnd;
14998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Corresponds to the same-named boolean on the java side.
15008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_heightCanMeasure;
15018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int m_lastDx;
15028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkMSec m_lastDxTime;
150387962ce00229855c098ba12cee8d5c015a835289Cary Clark    SelectText m_selectText;
1504f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    FindOnPage m_findOnPage;
150587962ce00229855c098ba12cee8d5c015a835289Cary Clark    CursorRing m_ring;
15066d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    BaseLayerAndroid* m_baseLayer;
1507908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    Functor* m_glDrawFunctor;
1508a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
1509c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    GLWebViewState* m_glWebViewState;
1510a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
15114de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins    const RenderSkinButton* m_buttonSkin;
15128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; // end of WebView class
15138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1514908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
1515908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase/**
1516908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * This class holds a function pointer and parameters for calling drawGL into a specific
1517908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * viewport. The pointer to the Functor will be put on a framework display list to be called
1518908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * when the display list is replayed.
1519908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase */
1520908703e420f4931f74527aaeb3d5faabdd66c28aChet Haaseclass GLDrawFunctor : Functor {
1521908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    public:
1522908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    GLDrawFunctor(WebView* _wvInstance,
1523be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard            bool(WebView::*_funcPtr)(WebCore::IntRect&, WebCore::IntRect*, WebCore::IntRect&, int, WebCore::IntRect&, jfloat, jint),
1524908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase            WebCore::IntRect _viewRect, float _scale, int _extras) {
1525908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        wvInstance = _wvInstance;
1526908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        funcPtr = _funcPtr;
1527908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        viewRect = _viewRect;
1528908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        scale = _scale;
1529908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        extras = _extras;
1530908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    };
153179d8e0434bfe00a793e8041f96dc02ec1d98e694Romain Guy    status_t operator()(int messageId, void* data) {
153279d8e0434bfe00a793e8041f96dc02ec1d98e694Romain Guy        if (viewRect.isEmpty()) {
1533821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase            // NOOP operation if viewport is empty
1534821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase            return 0;
1535821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase        }
153679d8e0434bfe00a793e8041f96dc02ec1d98e694Romain Guy
15379f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard        WebCore::IntRect inval;
15389f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard        int titlebarHeight = webViewRect.height() - viewRect.height();
1539b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner
1540b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner        uirenderer::DrawGlInfo* info = reinterpret_cast<uirenderer::DrawGlInfo*>(data);
1541b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner        WebCore::IntRect localViewRect = viewRect;
1542b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner        if (info->isLayer)
1543b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner            localViewRect.move(-1 * localViewRect.x(), -1 * localViewRect.y());
1544b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner
1545be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard        WebCore::IntRect clip(info->clipLeft, info->clipTop,
1546be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard                              info->clipRight - info->clipLeft,
1547be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard                              info->clipBottom - info->clipTop);
1548be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard
1549be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard        bool retVal = (*wvInstance.*funcPtr)(localViewRect, &inval, webViewRect, titlebarHeight, clip, scale, extras);
1550b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy        if (retVal) {
15519f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard            IntRect finalInval;
15529f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard            if (inval.isEmpty()) {
15539f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard                finalInval = webViewRect;
1554be25f896a5c754e96c6c0d4719a79d523293d40fNicolas Roard                retVal = true;
15559f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard            } else {
15569f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard                finalInval.setX(webViewRect.x() + inval.x());
1557be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard                finalInval.setY(webViewRect.y() + titlebarHeight + inval.y());
15589f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard                finalInval.setWidth(inval.width());
15599f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard                finalInval.setHeight(inval.height());
15609f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard            }
1561d1f5cf1ad8b20860bd9cb34a483451019124d1f9Romain Guy            info->dirtyLeft = finalInval.x();
1562d1f5cf1ad8b20860bd9cb34a483451019124d1f9Romain Guy            info->dirtyTop = finalInval.y();
15631ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block            info->dirtyRight = finalInval.maxX();
15641ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block            info->dirtyBottom = finalInval.maxY();
1565b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy        }
1566908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        // return 1 if invalidation needed, 0 otherwise
1567908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        return retVal ? 1 : 0;
1568908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    }
1569908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    void updateRect(WebCore::IntRect& _viewRect) {
1570908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        viewRect = _viewRect;
1571908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    }
1572b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy    void updateViewRect(WebCore::IntRect& _viewRect) {
1573b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy        webViewRect = _viewRect;
1574b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy    }
1575908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    private:
1576908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    WebView* wvInstance;
1577be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard    bool (WebView::*funcPtr)(WebCore::IntRect&, WebCore::IntRect*, WebCore::IntRect&, int, WebCore::IntRect&, float, int);
1578908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    WebCore::IntRect viewRect;
1579b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy    WebCore::IntRect webViewRect;
1580908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    jfloat scale;
1581908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    jint extras;
1582908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase};
1583908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
15848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
15858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Native JNI methods
15868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
1587d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkstatic int nativeCacheHitFramePointer(JNIEnv *env, jobject obj)
1588d4924af12855cd19162ba1442a6055664c98ca32Cary Clark{
1589d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    return reinterpret_cast<int>(GET_NATIVE_VIEW(env, obj)
1590d4924af12855cd19162ba1442a6055664c98ca32Cary Clark            ->m_cacheHitFrame->framePointer());
1591d4924af12855cd19162ba1442a6055664c98ca32Cary Clark}
1592d4924af12855cd19162ba1442a6055664c98ca32Cary Clark
1593d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkstatic jobject nativeCacheHitNodeBounds(JNIEnv *env, jobject obj)
1594d4924af12855cd19162ba1442a6055664c98ca32Cary Clark{
1595d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    WebCore::IntRect bounds = GET_NATIVE_VIEW(env, obj)
1596d4924af12855cd19162ba1442a6055664c98ca32Cary Clark        ->m_cacheHitNode->originalAbsoluteBounds();
1597d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    jclass rectClass = env->FindClass("android/graphics/Rect");
1598d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V");
1599d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    jobject rect = env->NewObject(rectClass, init, bounds.x(),
16001ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block        bounds.y(), bounds.maxX(), bounds.maxY());
1601bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(rectClass);
1602d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    return rect;
1603d4924af12855cd19162ba1442a6055664c98ca32Cary Clark}
1604d4924af12855cd19162ba1442a6055664c98ca32Cary Clark
1605d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkstatic int nativeCacheHitNodePointer(JNIEnv *env, jobject obj)
1606d4924af12855cd19162ba1442a6055664c98ca32Cary Clark{
1607d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    return reinterpret_cast<int>(GET_NATIVE_VIEW(env, obj)
1608d4924af12855cd19162ba1442a6055664c98ca32Cary Clark        ->m_cacheHitNode->nodePointer());
1609d4924af12855cd19162ba1442a6055664c98ca32Cary Clark}
1610d4924af12855cd19162ba1442a6055664c98ca32Cary Clark
1611b57c3a124715a89ac026e86f4fd3890529525d11Cary Clarkstatic bool nativeCacheHitIsPlugin(JNIEnv *env, jobject obj)
1612b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark{
1613b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark    return GET_NATIVE_VIEW(env, obj)->m_cacheHitNode->isPlugin();
1614b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark}
1615b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark
1616c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clarkstatic void nativeClearCursor(JNIEnv *env, jobject obj)
16178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
16188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
16198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
1620c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    view->clearCursor();
16218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
16228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16234de82d04a6a82fee6e2d924768e88af58e966982Leon Scrogginsstatic void nativeCreate(JNIEnv *env, jobject obj, int viewImpl, jstring drawableDir,
16244de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins                         jobject jAssetManager)
16258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
16264de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins    AssetManager* am = assetManagerForJavaObject(env, jAssetManager);
16274de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins    WTF::String dir = jstringToWtfString(env, drawableDir);
16284de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins    WebView* webview = new WebView(env, obj, viewImpl, dir, am);
16298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // NEED THIS OR SOMETHING LIKE IT!
16308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //Release(obj);
16318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
16328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
163346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jint nativeCursorFramePointer(JNIEnv *env, jobject obj)
163446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
163546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
163646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
163746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    if (!root)
163846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        return 0;
163946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedFrame* frame = 0;
164046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    (void) root->currentCursor(&frame);
164146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return reinterpret_cast<int>(frame ? frame->framePointer() : 0);
164246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
164346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
164446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic const CachedNode* getCursorNode(JNIEnv *env, jobject obj)
164546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
164646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
164746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
164846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return root ? root->currentCursor() : 0;
164946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
165046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
16511d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clarkstatic const CachedNode* getCursorNode(JNIEnv *env, jobject obj,
16521d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    const CachedFrame** frame)
16531d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark{
16541d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
16551d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
16561d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    return root ? root->currentCursor(frame) : 0;
16571d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark}
16581d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark
1659f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clarkstatic const CachedNode* getFocusCandidate(JNIEnv *env, jobject obj,
1660f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedFrame** frame)
1661f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark{
1662f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
1663f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
1664f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark    if (!root)
1665f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark        return 0;
1666f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedNode* cursor = root->currentCursor(frame);
1667f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark    if (cursor && cursor->wantsKeyEvents())
1668f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark        return cursor;
16694ca469897f8dc36063e262faccefe4b8eacb9e7bCary Clark    return root->currentFocus(frame);
1670f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark}
1671f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark
16722194b17e89b2ad4c0624f7612e417db6d69150adLeon Scrogginsstatic bool focusCandidateHasNextTextfield(JNIEnv *env, jobject obj)
16732194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins{
167465966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
167565966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
167665966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    if (!root)
167765966ae193adfef8d40419ad9c11515b0e56f257Cary Clark        return false;
167865966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    const CachedNode* cursor = root->currentCursor();
167965966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    if (!cursor || !cursor->isTextInput())
168065966ae193adfef8d40419ad9c11515b0e56f257Cary Clark        cursor = root->currentFocus();
16812194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins    if (!cursor || !cursor->isTextInput()) return false;
168265966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    return root->nextTextField(cursor, 0);
16832194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins}
16842194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins
168546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic const CachedNode* getFocusNode(JNIEnv *env, jobject obj)
168646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
168746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
168846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
168946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return root ? root->currentFocus() : 0;
169046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
169146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
16928026280044128436d8e89736519a0b32b6540201Cary Clarkstatic const CachedNode* getFocusNode(JNIEnv *env, jobject obj,
16938026280044128436d8e89736519a0b32b6540201Cary Clark    const CachedFrame** frame)
16948026280044128436d8e89736519a0b32b6540201Cary Clark{
16958026280044128436d8e89736519a0b32b6540201Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
16968026280044128436d8e89736519a0b32b6540201Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
16978026280044128436d8e89736519a0b32b6540201Cary Clark    return root ? root->currentFocus(frame) : 0;
16988026280044128436d8e89736519a0b32b6540201Cary Clark}
16998026280044128436d8e89736519a0b32b6540201Cary Clark
17001d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clarkstatic const CachedInput* getInputCandidate(JNIEnv *env, jobject obj)
17011d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark{
17021d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
17031d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
17041d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    if (!root)
17051d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark        return 0;
17061d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    const CachedFrame* frame;
17071d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    const CachedNode* cursor = root->currentCursor(&frame);
17081d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    if (!cursor || !cursor->wantsKeyEvents())
17091d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark        cursor = root->currentFocus(&frame);
17101d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    return cursor ? frame->textInput(cursor) : 0;
17111d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark}
17121d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark
17131cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scrogginsstatic jboolean nativePageShouldHandleShiftAndArrows(JNIEnv *env, jobject obj)
17141cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins{
17151cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    const CachedNode* focus = getFocusNode(env, obj);
17161cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    if (!focus) return false;
17171cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    // Plugins handle shift and arrows whether or not they have focus.
17181cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    if (focus->isPlugin()) return true;
17191cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    const CachedNode* cursor = getCursorNode(env, obj);
17201cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    // ContentEditable nodes should only receive shift and arrows if they have
17211cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    // both the cursor and the focus.
17221cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    return cursor && cursor->nodePointer() == focus->nodePointer()
17231cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins            && cursor->isContentEditable();
17241cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins}
17251cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins
172646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jobject nativeCursorNodeBounds(JNIEnv *env, jobject obj)
172746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
1728f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedFrame* frame;
1729f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedNode* node = getCursorNode(env, obj, &frame);
1730f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    WebCore::IntRect bounds = node ? node->bounds(frame)
173146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        : WebCore::IntRect(0, 0, 0, 0);
173246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    jclass rectClass = env->FindClass("android/graphics/Rect");
173346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V");
173446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    jobject rect = env->NewObject(rectClass, init, bounds.x(),
17351ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block        bounds.y(), bounds.maxX(), bounds.maxY());
1736bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(rectClass);
173746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return rect;
173846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
173946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
174046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jint nativeCursorNodePointer(JNIEnv *env, jobject obj)
174146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
174246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedNode* node = getCursorNode(env, obj);
174346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return reinterpret_cast<int>(node ? node->nodePointer() : 0);
174446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
174546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
174636747fa778285f57f2f53c047028be83e9d8776dCary Clarkstatic jobject nativeCursorPosition(JNIEnv *env, jobject obj)
174736747fa778285f57f2f53c047028be83e9d8776dCary Clark{
174836747fa778285f57f2f53c047028be83e9d8776dCary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
17490181faa1ffede024c2712df19ae7c855a8cf64e3Cary Clark    const CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
175036747fa778285f57f2f53c047028be83e9d8776dCary Clark    WebCore::IntPoint pos = WebCore::IntPoint(0, 0);
175136747fa778285f57f2f53c047028be83e9d8776dCary Clark    if (root)
175219194ea29920c2f7a02d08dfb0416608bc81dbb7Leon Scroggins        root->getSimulatedMousePosition(&pos);
175336747fa778285f57f2f53c047028be83e9d8776dCary Clark    jclass pointClass = env->FindClass("android/graphics/Point");
175436747fa778285f57f2f53c047028be83e9d8776dCary Clark    jmethodID init = env->GetMethodID(pointClass, "<init>", "(II)V");
175536747fa778285f57f2f53c047028be83e9d8776dCary Clark    jobject point = env->NewObject(pointClass, init, pos.x(), pos.y());
1756bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(pointClass);
175736747fa778285f57f2f53c047028be83e9d8776dCary Clark    return point;
175836747fa778285f57f2f53c047028be83e9d8776dCary Clark}
175936747fa778285f57f2f53c047028be83e9d8776dCary Clark
176046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic WebCore::IntRect jrect_to_webrect(JNIEnv* env, jobject obj)
176146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
176246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    int L, T, R, B;
176346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    GraphicsJNI::get_jrect(env, obj, &L, &T, &R, &B);
176446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return WebCore::IntRect(L, T, R - L, B - T);
176546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
176646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
176746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic bool nativeCursorIntersects(JNIEnv *env, jobject obj, jobject visRect)
176846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
1769f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedFrame* frame;
1770f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedNode* node = getCursorNode(env, obj, &frame);
1771f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    return node ? node->bounds(frame).intersects(
1772f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark        jrect_to_webrect(env, visRect)) : false;
177346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
177446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
177546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic bool nativeCursorIsAnchor(JNIEnv *env, jobject obj)
177646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
177746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedNode* node = getCursorNode(env, obj);
177846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return node ? node->isAnchor() : false;
177946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
178046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
178146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic bool nativeCursorIsTextInput(JNIEnv *env, jobject obj)
178246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
178346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedNode* node = getCursorNode(env, obj);
17841d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    return node ? node->isTextInput() : false;
178546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
178646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
178746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jobject nativeCursorText(JNIEnv *env, jobject obj)
178846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
178946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedNode* node = getCursorNode(env, obj);
179046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    if (!node)
179146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        return 0;
179245b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch    WTF::String value = node->getExport();
179379b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block    return wtfStringToJstring(env, value);
179446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
179546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
17968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeDebugDump(JNIEnv *env, jobject obj)
17978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
17988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if DUMP_NAV_CACHE
17998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
18008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
18018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    view->debugDump();
18028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
18038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
18048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18056d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic jint nativeDraw(JNIEnv *env, jobject obj, jobject canv, jint color,
18066d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        jint extras, jboolean split) {
18078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkCanvas* canvas = GraphicsJNI::getNativeCanvas(env, canv);
18086d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    return reinterpret_cast<jint>(GET_NATIVE_VIEW(env, obj)->draw(canvas, color, extras, split));
18098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
18108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1811b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guystatic jint nativeGetDrawGLFunction(JNIEnv *env, jobject obj, jobject jrect, jobject jviewrect,
1812908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        jfloat scale, jint extras) {
1813821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase    WebCore::IntRect viewRect;
1814821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase    if (jrect == NULL) {
1815821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase        viewRect = WebCore::IntRect();
1816821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase    } else {
1817821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase        viewRect = jrect_to_webrect(env, jrect);
1818821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase    }
1819908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    WebView *wvInstance = GET_NATIVE_VIEW(env, obj);
1820908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    GLDrawFunctor* functor = new GLDrawFunctor(wvInstance, &android::WebView::drawGL,
1821908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase            viewRect, scale, extras);
1822908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    wvInstance->setFunctor((Functor*) functor);
1823b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy
1824b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy    WebCore::IntRect webViewRect;
1825b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy    if (jviewrect == NULL) {
1826b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy        webViewRect = WebCore::IntRect();
1827b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy    } else {
1828b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy        webViewRect = jrect_to_webrect(env, jviewrect);
1829b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy    }
1830b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy    functor->updateViewRect(webViewRect);
1831b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy
1832908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    return (jint)functor;
1833908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}
1834908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
1835b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guystatic void nativeUpdateDrawGLFunction(JNIEnv *env, jobject obj, jobject jrect, jobject jviewrect) {
1836908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    WebView *wvInstance = GET_NATIVE_VIEW(env, obj);
1837908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    if (wvInstance != NULL) {
1838908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        GLDrawFunctor* functor = (GLDrawFunctor*) wvInstance->getFunctor();
1839908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        if (functor != NULL) {
1840821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase            WebCore::IntRect viewRect;
1841821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase            if (jrect == NULL) {
1842821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase                viewRect = WebCore::IntRect();
1843821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase            } else {
1844821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase                viewRect = jrect_to_webrect(env, jrect);
1845821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase            }
1846908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase            functor->updateRect(viewRect);
1847b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy
1848b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy            WebCore::IntRect webViewRect;
1849b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy            if (jviewrect == NULL) {
1850b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy                webViewRect = WebCore::IntRect();
1851b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy            } else {
1852b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy                webViewRect = jrect_to_webrect(env, jviewrect);
1853b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy            }
1854b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy            functor->updateViewRect(webViewRect);
1855908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        }
1856908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    }
1857908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}
1858908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
185987962ce00229855c098ba12cee8d5c015a835289Cary Clarkstatic bool nativeEvaluateLayersAnimations(JNIEnv *env, jobject obj)
1860797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{
1861797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#if USE(ACCELERATED_COMPOSITING)
18629f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard    LayerAndroid* root = GET_NATIVE_VIEW(env, obj)->compositeRoot();
186387962ce00229855c098ba12cee8d5c015a835289Cary Clark    if (root)
186487962ce00229855c098ba12cee8d5c015a835289Cary Clark        return root->evaluateAnimations();
1865797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#endif
1866797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard    return false;
1867797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard}
1868797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard
186967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roardstatic void nativeSetBaseLayer(JNIEnv *env, jobject obj, jint layer, jobject inval,
18706a3bd3f2b6b5a5c80e5fc1674550456b67e2cc7cShimeng (Simon) Wang                                jboolean showVisualIndicator,
18716a3bd3f2b6b5a5c80e5fc1674550456b67e2cc7cShimeng (Simon) Wang                                jboolean isPictureAfterFirstLayout)
1872f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{
18736d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    BaseLayerAndroid* layerImpl = reinterpret_cast<BaseLayerAndroid*>(layer);
187467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    SkRegion invalRegion;
187567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    if (inval)
187667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard        invalRegion = *GraphicsJNI::getNativeRegion(env, inval);
18776a3bd3f2b6b5a5c80e5fc1674550456b67e2cc7cShimeng (Simon) Wang    GET_NATIVE_VIEW(env, obj)->setBaseLayer(layerImpl, invalRegion, showVisualIndicator,
18786a3bd3f2b6b5a5c80e5fc1674550456b67e2cc7cShimeng (Simon) Wang                                            isPictureAfterFirstLayout);
18796d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
18806d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
18814212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reckstatic BaseLayerAndroid* nativeGetBaseLayer(JNIEnv *env, jobject obj)
18824212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck{
18834212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck    return GET_NATIVE_VIEW(env, obj)->getBaseLayer();
18844212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck}
18854212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck
18866d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic void nativeReplaceBaseContent(JNIEnv *env, jobject obj, jint content)
18876d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
18886d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    PictureSet* set = reinterpret_cast<PictureSet*>(content);
18896d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    GET_NATIVE_VIEW(env, obj)->replaceBaseContent(set);
18906d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
18916d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
18926d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic void nativeCopyBaseContentToPicture(JNIEnv *env, jobject obj, jobject pict)
18936d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
18946d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    SkPicture* picture = GraphicsJNI::getNativePicture(env, pict);
18956d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    GET_NATIVE_VIEW(env, obj)->copyBaseContentToPicture(picture);
18966d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
18976d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
18986d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic bool nativeHasContent(JNIEnv *env, jobject obj)
18996d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
19006d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    return GET_NATIVE_VIEW(env, obj)->hasContent();
1901f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark}
1902f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark
19038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jobject nativeImageURI(JNIEnv *env, jobject obj, jint x, jint y)
19048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
19058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
19068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
190745b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch    WTF::String uri = view->imageURI(x, y);
190879b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block    return wtfStringToJstring(env, uri);
19098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
19108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
191149e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clarkstatic jint nativeFocusCandidateFramePointer(JNIEnv *env, jobject obj)
191249e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark{
191349e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
191449e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
191549e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark    if (!root)
191649e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark        return 0;
191749e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark    const CachedFrame* frame = 0;
191849e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark    const CachedNode* cursor = root->currentCursor(&frame);
191949e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark    if (!cursor || !cursor->wantsKeyEvents())
192049e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark        (void) root->currentFocus(&frame);
192149e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark    return reinterpret_cast<int>(frame ? frame->framePointer() : 0);
192249e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark}
192349e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark
1924bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic bool nativeFocusCandidateIsPassword(JNIEnv *env, jobject obj)
192546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
19261d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    const CachedInput* input = getInputCandidate(env, obj);
1927737a377f81baa2bf868b48f3457cc9a53cea2e6eBen Murdoch    return input && input->getType() == CachedInput::PASSWORD;
192846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
192946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
1930bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic bool nativeFocusCandidateIsRtlText(JNIEnv *env, jobject obj)
193146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
19321d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    const CachedInput* input = getInputCandidate(env, obj);
19331d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    return input ? input->isRtlText() : false;
193446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
193546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
1936bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic bool nativeFocusCandidateIsTextInput(JNIEnv *env, jobject obj)
193746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
1938f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedNode* node = getFocusCandidate(env, obj, 0);
19391d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    return node ? node->isTextInput() : false;
194046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
194146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
1942bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic jint nativeFocusCandidateMaxLength(JNIEnv *env, jobject obj)
194346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
19441d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    const CachedInput* input = getInputCandidate(env, obj);
19451d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    return input ? input->maxLength() : false;
194646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
194746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
1948ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scrogginsstatic jint nativeFocusCandidateIsAutoComplete(JNIEnv *env, jobject obj)
1949ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins{
1950ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins    const CachedInput* input = getInputCandidate(env, obj);
1951ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins    return input ? input->autoComplete() : false;
1952ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins}
1953ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins
1954bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic jobject nativeFocusCandidateName(JNIEnv *env, jobject obj)
195546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
19561d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    const CachedInput* input = getInputCandidate(env, obj);
19571d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    if (!input)
195846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        return 0;
195945b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch    const WTF::String& name = input->name();
196079b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block    return wtfStringToJstring(env, name);
196146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
196246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
1963390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scrogginsstatic jobject createJavaRect(JNIEnv* env, int x, int y, int right, int bottom)
1964390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins{
1965390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    jclass rectClass = env->FindClass("android/graphics/Rect");
1966390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V");
1967390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    jobject rect = env->NewObject(rectClass, init, x, y, right, bottom);
1968bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(rectClass);
1969390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    return rect;
1970390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins}
1971390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins
1972bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic jobject nativeFocusCandidateNodeBounds(JNIEnv *env, jobject obj)
197346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
1974f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedFrame* frame;
1975f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedNode* node = getFocusCandidate(env, obj, &frame);
1976f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    WebCore::IntRect bounds = node ? node->bounds(frame)
197746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        : WebCore::IntRect(0, 0, 0, 0);
19781ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block    return createJavaRect(env, bounds.x(), bounds.y(), bounds.maxX(), bounds.maxY());
1979390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins}
1980390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins
1981390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scrogginsstatic jobject nativeFocusCandidatePaddingRect(JNIEnv *env, jobject obj)
1982390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins{
1983390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    const CachedInput* input = getInputCandidate(env, obj);
1984390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    if (!input)
1985390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins        return 0;
1986390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    // Note that the Java Rect is being used to pass four integers, rather than
1987390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    // being used as an actual rectangle.
1988390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    return createJavaRect(env, input->paddingLeft(), input->paddingTop(),
1989390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins            input->paddingRight(), input->paddingBottom());
199046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
199146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
1992bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic jint nativeFocusCandidatePointer(JNIEnv *env, jobject obj)
199346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
1994f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedNode* node = getFocusCandidate(env, obj, 0);
199546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return reinterpret_cast<int>(node ? node->nodePointer() : 0);
199646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
199746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
1998bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic jobject nativeFocusCandidateText(JNIEnv *env, jobject obj)
199946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
2000f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedNode* node = getFocusCandidate(env, obj, 0);
200146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    if (!node)
200246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        return 0;
200345b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch    WTF::String value = node->getExport();
200479b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block    return wtfStringToJstring(env, value);
200546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
200646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
2007d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scrogginsstatic int nativeFocusCandidateLineHeight(JNIEnv *env, jobject obj)
2008d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins{
2009d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins    const CachedInput* input = getInputCandidate(env, obj);
2010d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins    return input ? input->lineHeight() : 0;
2011d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins}
2012d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins
20133a3b28707d2d6a06afe9f3137e9bedc07246d600Leon Scrogginsstatic jfloat nativeFocusCandidateTextSize(JNIEnv *env, jobject obj)
201446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
20151d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    const CachedInput* input = getInputCandidate(env, obj);
20163a3b28707d2d6a06afe9f3137e9bedc07246d600Leon Scroggins    return input ? input->textSize() : 0.f;
201746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
201846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
201974757b62fce144f27c25cc7744df82cd7411b2dcLeon Scrogginsstatic int nativeFocusCandidateType(JNIEnv *env, jobject obj)
202074757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins{
202174757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins    const CachedInput* input = getInputCandidate(env, obj);
202241c8cd06bd25769654e321d1222856182ebad067Ben Murdoch    if (!input)
2023737a377f81baa2bf868b48f3457cc9a53cea2e6eBen Murdoch        return CachedInput::NONE;
202441c8cd06bd25769654e321d1222856182ebad067Ben Murdoch
202541c8cd06bd25769654e321d1222856182ebad067Ben Murdoch    if (input->isTextArea())
2026737a377f81baa2bf868b48f3457cc9a53cea2e6eBen Murdoch        return CachedInput::TEXT_AREA;
2027737a377f81baa2bf868b48f3457cc9a53cea2e6eBen Murdoch
2028737a377f81baa2bf868b48f3457cc9a53cea2e6eBen Murdoch    return input->getType();
202974757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins}
203074757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins
2031c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenbergerstatic bool nativeFocusIsPlugin(JNIEnv *env, jobject obj)
2032c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger{
2033c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger    const CachedNode* node = getFocusNode(env, obj);
2034c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger    return node ? node->isPlugin() : false;
2035c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger}
2036c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger
20378026280044128436d8e89736519a0b32b6540201Cary Clarkstatic jobject nativeFocusNodeBounds(JNIEnv *env, jobject obj)
20388026280044128436d8e89736519a0b32b6540201Cary Clark{
20398026280044128436d8e89736519a0b32b6540201Cary Clark    const CachedFrame* frame;
20408026280044128436d8e89736519a0b32b6540201Cary Clark    const CachedNode* node = getFocusNode(env, obj, &frame);
20418026280044128436d8e89736519a0b32b6540201Cary Clark    WebCore::IntRect bounds = node ? node->bounds(frame)
20428026280044128436d8e89736519a0b32b6540201Cary Clark        : WebCore::IntRect(0, 0, 0, 0);
20438026280044128436d8e89736519a0b32b6540201Cary Clark    jclass rectClass = env->FindClass("android/graphics/Rect");
20448026280044128436d8e89736519a0b32b6540201Cary Clark    jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V");
20458026280044128436d8e89736519a0b32b6540201Cary Clark    jobject rect = env->NewObject(rectClass, init, bounds.x(),
20461ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block        bounds.y(), bounds.maxX(), bounds.maxY());
2047bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(rectClass);
20488026280044128436d8e89736519a0b32b6540201Cary Clark    return rect;
20498026280044128436d8e89736519a0b32b6540201Cary Clark}
20508026280044128436d8e89736519a0b32b6540201Cary Clark
2051539427bc7572dfd8b28579c67460186406dcb246Leon Scrogginsstatic jint nativeFocusNodePointer(JNIEnv *env, jobject obj)
2052539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins{
2053539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins    const CachedNode* node = getFocusNode(env, obj);
2054539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins    return node ? reinterpret_cast<int>(node->nodePointer()) : 0;
2055539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins}
2056539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins
2057f4669cac3858848a9247e801b6106aeae6d406e8Cary Clarkstatic bool nativeCursorWantsKeyEvents(JNIEnv* env, jobject jwebview) {
20588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, jwebview);
20598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
2060f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark    return view->cursorWantsKeyEvents();
20618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
20628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2063c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clarkstatic void nativeHideCursor(JNIEnv *env, jobject obj)
2064c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark{
2065c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
2066c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
2067c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    view->hideCursor();
2068c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark}
2069c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark
20708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeInstrumentReport(JNIEnv *env, jobject obj)
20718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
20728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_INSTRUMENT
20738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    TimeCounter::reportNow();
20748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
20758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
20768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeSelectBestAt(JNIEnv *env, jobject obj, jobject jrect)
20788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
20798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
20808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
20818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::IntRect rect = jrect_to_webrect(env, jrect);
20828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    view->selectBestAt(rect);
20838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
20848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20851b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganovstatic void nativeSelectAt(JNIEnv *env, jobject obj, jint x, jint y)
20861b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov{
20871b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov    WebView* view = GET_NATIVE_VIEW(env, obj);
20881b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
20891b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov    WebCore::IntRect rect = IntRect(x, y , 1, 1);
20901b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov    view->selectBestAt(rect);
20911b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov    if (view->hasCursorNode())
20921b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov        view->showCursorUntimed();
20931b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov}
20941b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov
20959092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clarkstatic jobject nativeLayerBounds(JNIEnv* env, jobject obj, jint jlayer)
20969092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark{
20979092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    SkRect r;
20989092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark#if USE(ACCELERATED_COMPOSITING)
20999092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    LayerAndroid* layer = (LayerAndroid*) jlayer;
21009092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    r = layer->bounds();
21019092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark#else
21029092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    r.setEmpty();
21039092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark#endif
21049092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    SkIRect irect;
21059092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    r.round(&irect);
21069092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    jclass rectClass = env->FindClass("android/graphics/Rect");
21079092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V");
21089092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    jobject rect = env->NewObject(rectClass, init, irect.fLeft, irect.fTop,
21099092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark        irect.fRight, irect.fBottom);
21109092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    env->DeleteLocalRef(rectClass);
21119092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    return rect;
21129092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark}
21139092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark
2114cc4e3c422964c7d999e8f340057f303140d845ddCary Clarkstatic jobject nativeSubtractLayers(JNIEnv* env, jobject obj, jobject jrect)
2115cc4e3c422964c7d999e8f340057f303140d845ddCary Clark{
2116cc4e3c422964c7d999e8f340057f303140d845ddCary Clark    SkIRect irect = jrect_to_webrect(env, jrect);
2117cc4e3c422964c7d999e8f340057f303140d845ddCary Clark#if USE(ACCELERATED_COMPOSITING)
21186d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    LayerAndroid* root = GET_NATIVE_VIEW(env, obj)->compositeRoot();
2119cc4e3c422964c7d999e8f340057f303140d845ddCary Clark    if (root) {
2120cc4e3c422964c7d999e8f340057f303140d845ddCary Clark        SkRect rect;
2121cc4e3c422964c7d999e8f340057f303140d845ddCary Clark        rect.set(irect);
2122cc4e3c422964c7d999e8f340057f303140d845ddCary Clark        rect = root->subtractLayers(rect);
2123cc4e3c422964c7d999e8f340057f303140d845ddCary Clark        rect.round(&irect);
2124cc4e3c422964c7d999e8f340057f303140d845ddCary Clark    }
2125cc4e3c422964c7d999e8f340057f303140d845ddCary Clark#endif
2126cc4e3c422964c7d999e8f340057f303140d845ddCary Clark    jclass rectClass = env->FindClass("android/graphics/Rect");
2127cc4e3c422964c7d999e8f340057f303140d845ddCary Clark    jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V");
2128bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    jobject rect = env->NewObject(rectClass, init, irect.fLeft, irect.fTop,
2129cc4e3c422964c7d999e8f340057f303140d845ddCary Clark        irect.fRight, irect.fBottom);
2130bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(rectClass);
2131bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    return rect;
2132cc4e3c422964c7d999e8f340057f303140d845ddCary Clark}
2133cc4e3c422964c7d999e8f340057f303140d845ddCary Clark
213446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jint nativeTextGeneration(JNIEnv *env, jobject obj)
213546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
213646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
213746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
213846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return root ? root->textGeneration() : 0;
213946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
214046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
2141d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkstatic bool nativePointInNavCache(JNIEnv *env, jobject obj,
2142d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    int x, int y, int slop)
2143d4924af12855cd19162ba1442a6055664c98ca32Cary Clark{
2144d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    return GET_NATIVE_VIEW(env, obj)->pointInNavCache(x, y, slop);
2145d4924af12855cd19162ba1442a6055664c98ca32Cary Clark}
2146d4924af12855cd19162ba1442a6055664c98ca32Cary Clark
21478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool nativeMotionUp(JNIEnv *env, jobject obj,
2148d48434fc633d173b549b97b1c614072adc9648a8Cary Clark    int x, int y, int slop)
21498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
21518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
215246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return view->motionUp(x, y, slop);
21538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
215546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic bool nativeHasCursorNode(JNIEnv *env, jobject obj)
21568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
215746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return GET_NATIVE_VIEW(env, obj)->hasCursorNode();
21588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
216046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic bool nativeHasFocusNode(JNIEnv *env, jobject obj)
21618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
216246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return GET_NATIVE_VIEW(env, obj)->hasFocusNode();
21638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2165bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic bool nativeMoveCursor(JNIEnv *env, jobject obj,
216646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    int key, int count, bool ignoreScroll)
21678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
216946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    DBG_NAV_LOGD("env=%p obj=%p view=%p", env, obj, view);
21708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
21714ca8bc94f71466d1109bfbb9ef00da3256a0899bCary Clark    return view->moveCursor(key, count, ignoreScroll);
21728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeRecordButtons(JNIEnv* env, jobject obj, bool hasFocus,
21758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool pressed, bool invalidate)
21768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
21788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
21798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    view->nativeRecordButtons(hasFocus, pressed, invalidate);
21808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2182afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clarkstatic void nativeSetFindIsUp(JNIEnv *env, jobject obj, jboolean isUp)
21838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
21858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
2186afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    view->setFindIsUp(isUp);
2187afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark}
2188afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark
2189afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clarkstatic void nativeSetFindIsEmpty(JNIEnv *env, jobject obj)
2190afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark{
2191afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    GET_NATIVE_VIEW(env, obj)->setFindIsEmpty();
21928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
219432dffb883f56b18019afa7a01b2564b993b3fe8eCary Clarkstatic void nativeShowCursorTimed(JNIEnv *env, jobject obj)
21958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
219632dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    GET_NATIVE_VIEW(env, obj)->showCursorTimed();
21978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeSetHeightCanMeasure(JNIEnv *env, jobject obj, bool measure)
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 nativeSetHeightCanMeasure");
22038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    view->setHeightCanMeasure(measure);
22048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
220646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jobject nativeGetCursorRingBounds(JNIEnv *env, jobject obj)
22078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
22098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
22108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jclass rectClass = env->FindClass("android/graphics/Rect");
22118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(rectClass, "Could not find Rect class!");
22128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V");
22138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(init, "Could not find constructor for Rect");
22148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::IntRect webRect;
221546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    view->cursorRingBounds(&webRect);
22168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jobject rect = env->NewObject(rectClass, init, webRect.x(),
22171ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block        webRect.y(), webRect.maxX(), webRect.maxY());
2218bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(rectClass);
22198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return rect;
22208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic int nativeFindAll(JNIEnv *env, jobject obj, jstring findLower,
2223db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins        jstring findUpper, jboolean sameAsLastSearch)
22248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If one or the other is null, do not search.
22268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!(findLower && findUpper))
22278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
22288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Obtain the characters for both the lower case string and the upper case
22298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // string representing the same word.
22308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const jchar* findLowerChars = env->GetStringChars(findLower, 0);
22318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const jchar* findUpperChars = env->GetStringChars(findUpper, 0);
22328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If one or the other is null, do not search.
22338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!(findLowerChars && findUpperChars)) {
22348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (findLowerChars)
22358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            env->ReleaseStringChars(findLower, findLowerChars);
22368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (findUpperChars)
22378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            env->ReleaseStringChars(findUpper, findUpperChars);
22388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        checkException(env);
22398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
22408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
22418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
22428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in nativeFindAll");
224346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    CachedRoot* root = view->getFrameCache(WebView::AllowNewer);
22448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!root) {
22458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        env->ReleaseStringChars(findLower, findLowerChars);
22468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        env->ReleaseStringChars(findUpper, findUpperChars);
22478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        checkException(env);
22488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
22498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
22508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int length = env->GetStringLength(findLower);
22518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If the lengths of the strings do not match, then they are not the same
22528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // word, so do not search.
22538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!length || env->GetStringLength(findUpper) != length) {
22548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        env->ReleaseStringChars(findLower, findLowerChars);
22558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        env->ReleaseStringChars(findUpper, findUpperChars);
22568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        checkException(env);
22578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
22588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
22598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int width = root->documentWidth();
22608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int height = root->documentHeight();
22618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Create a FindCanvas, which allows us to fake draw into it so we can
22628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // figure out where our search string is rendered (and how many times).
22638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FindCanvas canvas(width, height, (const UChar*) findLowerChars,
22648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            (const UChar*) findUpperChars, length << 1);
22658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkBitmap bitmap;
22668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bitmap.setConfig(SkBitmap::kARGB_8888_Config, width, height);
22678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    canvas.setBitmapDevice(bitmap);
2268f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    root->draw(canvas);
22698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WTF::Vector<MatchInfo>* matches = canvas.detachMatches();
22708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // With setMatches, the WebView takes ownership of matches
2271db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    view->setMatches(matches, sameAsLastSearch);
22728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    env->ReleaseStringChars(findLower, findLowerChars);
22748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    env->ReleaseStringChars(findUpper, findUpperChars);
22758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
22768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return canvas.found();
22778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeFindNext(JNIEnv *env, jobject obj, bool forward)
22808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
22828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in nativeFindNext");
22838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    view->findNext(forward);
22848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2286afbc0998ef990403a8e17efb9a384a46707a328eLeon Scrogginsstatic int nativeFindIndex(JNIEnv *env, jobject obj)
2287afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins{
2288afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins    WebView* view = GET_NATIVE_VIEW(env, obj);
2289afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins    LOG_ASSERT(view, "view not set in nativeFindIndex");
2290afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins    return view->currentMatchIndex();
2291afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins}
2292afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins
22938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeUpdateCachedTextfield(JNIEnv *env, jobject obj, jstring updatedText, jint generation)
22948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
22968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in nativeUpdateCachedTextfield");
22978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
22988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!root)
22998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
23008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CachedNode* cachedFocusNode = root->currentFocus();
23011d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    if (!cachedFocusNode || !cachedFocusNode->isTextInput())
23028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
230327dd31673790eed64c3e0e508bb900671f06bcb3Steve Block    WTF::String webcoreString = jstringToWtfString(env, updatedText);
23048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    (const_cast<CachedNode*>(cachedFocusNode))->setExport(webcoreString);
23058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    root->setTextGeneration(generation);
23068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
23078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2309fa768f11d82c34980cce020f442329299efb08caCary Clarkstatic jint nativeGetBlockLeftEdge(JNIEnv *env, jobject obj, jint x, jint y,
2310fa768f11d82c34980cce020f442329299efb08caCary Clark        jfloat scale)
2311a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba{
2312a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba    WebView* view = GET_NATIVE_VIEW(env, obj);
2313a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
2314a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba    if (!view)
2315a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba        return -1;
2316fa768f11d82c34980cce020f442329299efb08caCary Clark    return view->getBlockLeftEdge(x, y, scale);
2317a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba}
2318a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba
23198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeDestroy(JNIEnv *env, jobject obj)
23208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
23228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOGD("nativeDestroy view: %p", view);
23238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in nativeDestroy");
23248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete view;
23258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23278360bc9c9facd690e42379610cbbb368d3d705efCary Clarkstatic void nativeStopGL(JNIEnv *env, jobject obj)
23288360bc9c9facd690e42379610cbbb368d3d705efCary Clark{
23298360bc9c9facd690e42379610cbbb368d3d705efCary Clark    GET_NATIVE_VIEW(env, obj)->stopGL();
23308360bc9c9facd690e42379610cbbb368d3d705efCary Clark}
23318360bc9c9facd690e42379610cbbb368d3d705efCary Clark
23328480ea3097f295aeccf7c088a06cceea543238b7Leon Scrogginsstatic bool nativeMoveCursorToNextTextInput(JNIEnv *env, jobject obj)
2333e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins{
2334e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins    WebView* view = GET_NATIVE_VIEW(env, obj);
2335e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
2336e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins    if (!root)
23378480ea3097f295aeccf7c088a06cceea543238b7Leon Scroggins        return false;
233865966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    const CachedNode* current = root->currentCursor();
233965966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    if (!current || !current->isTextInput())
234065966ae193adfef8d40419ad9c11515b0e56f257Cary Clark        current = root->currentFocus();
234165966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    if (!current || !current->isTextInput())
23428480ea3097f295aeccf7c088a06cceea543238b7Leon Scroggins        return false;
2343e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins    const CachedFrame* frame;
234465966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    const CachedNode* next = root->nextTextField(current, &frame);
2345e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins    if (!next)
23468480ea3097f295aeccf7c088a06cceea543238b7Leon Scroggins        return false;
2347f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const WebCore::IntRect& bounds = next->bounds(frame);
2348b0c9a2b4033eca931163e8223d7eaa8889337144Patrick Scott    root->rootHistory()->setMouseBounds(bounds);
234987962ce00229855c098ba12cee8d5c015a835289Cary Clark    view->getWebViewCore()->updateCursorBounds(root, frame, next);
235032dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    view->showCursorUntimed();
2351e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins    root->setCursor(const_cast<CachedFrame*>(frame),
2352e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins            const_cast<CachedNode*>(next));
2353bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins    view->sendMoveFocus(static_cast<WebCore::Frame*>(frame->framePointer()),
2354bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins            static_cast<WebCore::Node*>(next->nodePointer()));
23555065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    if (!next->isInLayer())
23565065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark        view->scrollRectOnScreen(bounds);
2357f74580c1504dcdd43fd15995b0e137982512dba2Leon Scroggins    view->getWebViewCore()->m_moveGeneration++;
23588480ea3097f295aeccf7c088a06cceea543238b7Leon Scroggins    return true;
2359e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins}
2360e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins
236146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic int nativeMoveGeneration(JNIEnv *env, jobject obj)
236246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
236336747fa778285f57f2f53c047028be83e9d8776dCary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
236436747fa778285f57f2f53c047028be83e9d8776dCary Clark    if (!view)
236536747fa778285f57f2f53c047028be83e9d8776dCary Clark        return 0;
2366b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark    return view->moveGeneration();
236746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
236846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
2369a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeMoveSelection(JNIEnv *env, jobject obj, int x, int y)
23708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2371a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    GET_NATIVE_VIEW(env, obj)->moveSelection(x, y);
2372a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
2373a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
2374a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeResetSelection(JNIEnv *env, jobject obj)
2375a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
2376a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return GET_NATIVE_VIEW(env, obj)->resetSelection();
2377a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
2378a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
2379515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clarkstatic jobject nativeSelectableText(JNIEnv* env, jobject obj)
2380515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark{
2381515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    IntPoint pos = GET_NATIVE_VIEW(env, obj)->selectableText();
2382515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    jclass pointClass = env->FindClass("android/graphics/Point");
2383515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    jmethodID init = env->GetMethodID(pointClass, "<init>", "(II)V");
2384515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    jobject point = env->NewObject(pointClass, init, pos.x(), pos.y());
2385515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    env->DeleteLocalRef(pointClass);
2386515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    return point;
2387515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark}
2388515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark
2389a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeSelectAll(JNIEnv* env, jobject obj)
2390a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
2391a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    GET_NATIVE_VIEW(env, obj)->selectAll();
2392a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
2393a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
2394a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeSetExtendSelection(JNIEnv *env, jobject obj)
2395a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
2396a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    GET_NATIVE_VIEW(env, obj)->setExtendSelection();
2397a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
2398a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
2399a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic jboolean nativeStartSelection(JNIEnv *env, jobject obj, int x, int y)
2400a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
2401a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return GET_NATIVE_VIEW(env, obj)->startSelection(x, y);
2402a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
2403a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
2404a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic jboolean nativeWordSelection(JNIEnv *env, jobject obj, int x, int y)
2405a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
2406a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return GET_NATIVE_VIEW(env, obj)->wordSelection(x, y);
2407a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
2408a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
2409a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeExtendSelection(JNIEnv *env, jobject obj, int x, int y)
2410a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
2411a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    GET_NATIVE_VIEW(env, obj)->extendSelection(x, y);
24128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
24138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jobject nativeGetSelection(JNIEnv *env, jobject obj)
24158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
24168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
24178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
24185e5962825729a211e093fd615ddc9e5b0bec10bdCary Clark    String selection = view->getSelection();
241979b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block    return wtfStringToJstring(env, selection);
24208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
24218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2422a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic jboolean nativeHitSelection(JNIEnv *env, jobject obj, int x, int y)
2423a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
2424a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return GET_NATIVE_VIEW(env, obj)->hitSelection(x, y);
2425a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
2426a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
2427a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic jint nativeSelectionX(JNIEnv *env, jobject obj)
242887962ce00229855c098ba12cee8d5c015a835289Cary Clark{
2429a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return GET_NATIVE_VIEW(env, obj)->selectionX();
243087962ce00229855c098ba12cee8d5c015a835289Cary Clark}
243187962ce00229855c098ba12cee8d5c015a835289Cary Clark
2432a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic jint nativeSelectionY(JNIEnv *env, jobject obj)
2433a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
2434a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return GET_NATIVE_VIEW(env, obj)->selectionY();
2435a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
2436a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
2437a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeSetSelectionPointer(JNIEnv *env, jobject obj, jboolean set,
2438a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    jfloat scale, jint x, jint y)
243987962ce00229855c098ba12cee8d5c015a835289Cary Clark{
2440a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    GET_NATIVE_VIEW(env, obj)->setSelectionPointer(set, scale, x, y);
244187962ce00229855c098ba12cee8d5c015a835289Cary Clark}
244287962ce00229855c098ba12cee8d5c015a835289Cary Clark
24438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_DUMP_DISPLAY_TREE
24448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void dumpToFile(const char text[], void* file) {
24458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fwrite(text, 1, strlen(text), reinterpret_cast<FILE*>(file));
24468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fwrite("\n", 1, 1, reinterpret_cast<FILE*>(file));
24478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
24488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
24498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeDumpDisplayTree(JNIEnv* env, jobject jwebview, jstring jurl)
24518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
24528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_DUMP_DISPLAY_TREE
24538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, jwebview);
24548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
24558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2456bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed    if (view && view->getWebViewCore()) {
2457bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed        FILE* file = fopen(DISPLAY_TREE_LOG_FILE, "w");
2458bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed        if (file) {
2459bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            SkFormatDumper dumper(dumpToFile, file);
2460bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // dump the URL
2461bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            if (jurl) {
2462bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed                const char* str = env->GetStringUTFChars(jurl, 0);
2463bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed                SkDebugf("Dumping %s to %s\n", str, DISPLAY_TREE_LOG_FILE);
2464bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed                dumpToFile(str, file);
2465bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed                env->ReleaseStringUTFChars(jurl, str);
24668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
2467bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // now dump the display tree
2468bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            SkDumpCanvas canvas(&dumper);
2469bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // this will playback the picture into the canvas, which will
2470bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // spew its contents to the dumper
24716d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba            view->draw(&canvas, 0, 0, false);
2472bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // we're done with the file now
2473bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            fwrite("\n", 1, 1, file);
2474bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            fclose(file);
24758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2476859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
24776d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        const LayerAndroid* rootLayer = view->compositeRoot();
2478f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark        if (rootLayer) {
2479859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard          FILE* file = fopen(LAYERS_TREE_LOG_FILE,"w");
2480859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard          if (file) {
2481859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard              rootLayer->dumpLayers(file, 0);
2482859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard              fclose(file);
2483859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard          }
2484859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard        }
2485859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard#endif
24868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
24878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
24888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
24898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2490f81c672a4f5c06621000a6df0984cde689397d94Cary Clarkstatic int nativeScrollableLayer(JNIEnv* env, jobject jwebview, jint x, jint y,
2491f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    jobject rect, jobject bounds)
2492a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{
2493a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    WebView* view = GET_NATIVE_VIEW(env, jwebview);
2494a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
2495f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    SkIRect nativeRect, nativeBounds;
2496f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    int id = view->scrollableLayer(x, y, &nativeRect, &nativeBounds);
2497f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins    if (rect)
2498f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins        GraphicsJNI::irect_to_jrect(nativeRect, env, rect);
2499f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins    if (bounds)
2500f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins        GraphicsJNI::irect_to_jrect(nativeBounds, env, bounds);
250122e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott    return id;
2502a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott}
2503a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott
250422e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scottstatic bool nativeScrollLayer(JNIEnv* env, jobject obj, jint layerId, jint x,
250522e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott        jint y)
2506a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{
2507a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL)
2508a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    WebView* view = GET_NATIVE_VIEW(env, obj);
25098598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott    LayerAndroid* root = view->compositeRoot();
25108598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott    if (!root)
25118598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott        return false;
25128598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott    LayerAndroid* layer = root->findById(layerId);
2513fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott    if (!layer || !layer->contentIsScrollable())
2514a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        return false;
2515fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott    return static_cast<ScrollableLayerAndroid*>(layer)->scrollTo(x, y);
2516a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#endif
2517a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    return false;
2518a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott}
2519a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott
25204da96b9950ba2e86203aa50be39adcc8431a95a4Ben Murdochstatic void nativeSetExpandedTileBounds(JNIEnv*, jobject, jboolean enabled)
25214da96b9950ba2e86203aa50be39adcc8431a95a4Ben Murdoch{
25224da96b9950ba2e86203aa50be39adcc8431a95a4Ben Murdoch    TilesManager::instance()->setExpandedTileBounds(enabled);
25234da96b9950ba2e86203aa50be39adcc8431a95a4Ben Murdoch}
25244da96b9950ba2e86203aa50be39adcc8431a95a4Ben Murdoch
25258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
25268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * JNI registration
25278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
25288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic JNINativeMethod gJavaWebViewMethods[] = {
2529d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    { "nativeCacheHitFramePointer", "()I",
2530d4924af12855cd19162ba1442a6055664c98ca32Cary Clark        (void*) nativeCacheHitFramePointer },
2531b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark    { "nativeCacheHitIsPlugin", "()Z",
2532b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark        (void*) nativeCacheHitIsPlugin },
2533d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    { "nativeCacheHitNodeBounds", "()Landroid/graphics/Rect;",
2534d4924af12855cd19162ba1442a6055664c98ca32Cary Clark        (void*) nativeCacheHitNodeBounds },
2535d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    { "nativeCacheHitNodePointer", "()I",
2536d4924af12855cd19162ba1442a6055664c98ca32Cary Clark        (void*) nativeCacheHitNodePointer },
2537c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    { "nativeClearCursor", "()V",
2538bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeClearCursor },
25394de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins    { "nativeCreate", "(ILjava/lang/String;Landroid/content/res/AssetManager;)V",
25408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeCreate },
254146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeCursorFramePointer", "()I",
254246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeCursorFramePointer },
25431cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    { "nativePageShouldHandleShiftAndArrows", "()Z",
25441cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins        (void*) nativePageShouldHandleShiftAndArrows },
254546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeCursorNodeBounds", "()Landroid/graphics/Rect;",
254646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeCursorNodeBounds },
254746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeCursorNodePointer", "()I",
254846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeCursorNodePointer },
254946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeCursorIntersects", "(Landroid/graphics/Rect;)Z",
255046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeCursorIntersects },
255146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeCursorIsAnchor", "()Z",
255246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeCursorIsAnchor },
255346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeCursorIsTextInput", "()Z",
255446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeCursorIsTextInput },
255536747fa778285f57f2f53c047028be83e9d8776dCary Clark    { "nativeCursorPosition", "()Landroid/graphics/Point;",
255636747fa778285f57f2f53c047028be83e9d8776dCary Clark        (void*) nativeCursorPosition },
255746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeCursorText", "()Ljava/lang/String;",
255846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeCursorText },
2559f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark    { "nativeCursorWantsKeyEvents", "()Z",
2560f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark        (void*)nativeCursorWantsKeyEvents },
25618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeDebugDump", "()V",
25628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeDebugDump },
25638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeDestroy", "()V",
25648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeDestroy },
25656d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    { "nativeDraw", "(Landroid/graphics/Canvas;IIZ)I",
25666d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeDraw },
2567b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy    { "nativeGetDrawGLFunction", "(Landroid/graphics/Rect;Landroid/graphics/Rect;FI)I",
2568908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        (void*) nativeGetDrawGLFunction },
2569b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy    { "nativeUpdateDrawGLFunction", "(Landroid/graphics/Rect;Landroid/graphics/Rect;)V",
2570908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        (void*) nativeUpdateDrawGLFunction },
257146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeDumpDisplayTree", "(Ljava/lang/String;)V",
257246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeDumpDisplayTree },
257387962ce00229855c098ba12cee8d5c015a835289Cary Clark    { "nativeEvaluateLayersAnimations", "()Z",
257487962ce00229855c098ba12cee8d5c015a835289Cary Clark        (void*) nativeEvaluateLayersAnimations },
2575a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeExtendSelection", "(II)V",
2576a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeExtendSelection },
2577db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    { "nativeFindAll", "(Ljava/lang/String;Ljava/lang/String;Z)I",
257846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeFindAll },
257946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeFindNext", "(Z)V",
258046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeFindNext },
2581afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins    { "nativeFindIndex", "()I",
2582afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins        (void*) nativeFindIndex},
258349e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark    { "nativeFocusCandidateFramePointer", "()I",
258449e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark        (void*) nativeFocusCandidateFramePointer },
25852194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins    { "nativeFocusCandidateHasNextTextfield", "()Z",
25862194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins        (void*) focusCandidateHasNextTextfield },
2587bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeFocusCandidateIsPassword", "()Z",
2588bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidateIsPassword },
2589bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeFocusCandidateIsRtlText", "()Z",
2590bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidateIsRtlText },
2591bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeFocusCandidateIsTextInput", "()Z",
2592bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidateIsTextInput },
2593d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins    { "nativeFocusCandidateLineHeight", "()I",
2594d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins        (void*) nativeFocusCandidateLineHeight },
2595bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeFocusCandidateMaxLength", "()I",
2596bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidateMaxLength },
2597ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins    { "nativeFocusCandidateIsAutoComplete", "()Z",
2598ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins        (void*) nativeFocusCandidateIsAutoComplete },
2599bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeFocusCandidateName", "()Ljava/lang/String;",
2600bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidateName },
2601bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeFocusCandidateNodeBounds", "()Landroid/graphics/Rect;",
2602bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidateNodeBounds },
2603390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    { "nativeFocusCandidatePaddingRect", "()Landroid/graphics/Rect;",
2604390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins        (void*) nativeFocusCandidatePaddingRect },
2605bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeFocusCandidatePointer", "()I",
2606bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidatePointer },
2607bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeFocusCandidateText", "()Ljava/lang/String;",
2608bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidateText },
26093a3b28707d2d6a06afe9f3137e9bedc07246d600Leon Scroggins    { "nativeFocusCandidateTextSize", "()F",
2610bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidateTextSize },
261174757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins    { "nativeFocusCandidateType", "()I",
261274757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins        (void*) nativeFocusCandidateType },
2613c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger    { "nativeFocusIsPlugin", "()Z",
2614c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger        (void*) nativeFocusIsPlugin },
26158026280044128436d8e89736519a0b32b6540201Cary Clark    { "nativeFocusNodeBounds", "()Landroid/graphics/Rect;",
26168026280044128436d8e89736519a0b32b6540201Cary Clark        (void*) nativeFocusNodeBounds },
2617539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins    { "nativeFocusNodePointer", "()I",
2618539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins        (void*) nativeFocusNodePointer },
261946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeGetCursorRingBounds", "()Landroid/graphics/Rect;",
262046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeGetCursorRingBounds },
26215e5962825729a211e093fd615ddc9e5b0bec10bdCary Clark    { "nativeGetSelection", "()Ljava/lang/String;",
262246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeGetSelection },
262346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeHasCursorNode", "()Z",
262446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeHasCursorNode },
262546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeHasFocusNode", "()Z",
262646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeHasFocusNode },
2627c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    { "nativeHideCursor", "()V",
2628c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark        (void*) nativeHideCursor },
2629a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeHitSelection", "(II)Z",
2630a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeHitSelection },
263146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeImageURI", "(II)Ljava/lang/String;",
263246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeImageURI },
26338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeInstrumentReport", "()V",
26348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeInstrumentReport },
26359092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    { "nativeLayerBounds", "(I)Landroid/graphics/Rect;",
26369092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark        (void*) nativeLayerBounds },
2637d48434fc633d173b549b97b1c614072adc9648a8Cary Clark    { "nativeMotionUp", "(III)Z",
26388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeMotionUp },
2639bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeMoveCursor", "(IIZ)Z",
2640bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeMoveCursor },
26418480ea3097f295aeccf7c088a06cceea543238b7Leon Scroggins    { "nativeMoveCursorToNextTextInput", "()Z",
2642e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins        (void*) nativeMoveCursorToNextTextInput },
264346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeMoveGeneration", "()I",
264446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeMoveGeneration },
2645a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeMoveSelection", "(II)V",
264646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeMoveSelection },
2647d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    { "nativePointInNavCache", "(III)Z",
2648d4924af12855cd19162ba1442a6055664c98ca32Cary Clark        (void*) nativePointInNavCache },
26498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeRecordButtons", "(ZZZ)V",
26508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeRecordButtons },
2651a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeResetSelection", "()V",
2652a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeResetSelection },
2653515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    { "nativeSelectableText", "()Landroid/graphics/Point;",
2654515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark        (void*) nativeSelectableText },
2655a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeSelectAll", "()V",
2656a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeSelectAll },
26578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeSelectBestAt", "(Landroid/graphics/Rect;)V",
26588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeSelectBestAt },
26591b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov    { "nativeSelectAt", "(II)V",
26601b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov        (void*) nativeSelectAt },
2661a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeSelectionX", "()I",
2662a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeSelectionX },
2663a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeSelectionY", "()I",
2664a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeSelectionY },
2665a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeSetExtendSelection", "()V",
2666a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeSetExtendSelection },
2667afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    { "nativeSetFindIsEmpty", "()V",
2668afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark        (void*) nativeSetFindIsEmpty },
2669afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    { "nativeSetFindIsUp", "(Z)V",
2670d74d4ceff106be90d9eaf08ec191a96bd87a7007Cary Clark        (void*) nativeSetFindIsUp },
26718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeSetHeightCanMeasure", "(Z)V",
26728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeSetHeightCanMeasure },
26736a3bd3f2b6b5a5c80e5fc1674550456b67e2cc7cShimeng (Simon) Wang    { "nativeSetBaseLayer", "(ILandroid/graphics/Region;ZZ)V",
26746d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeSetBaseLayer },
26754212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck    { "nativeGetBaseLayer", "()I",
26764212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck        (void*) nativeGetBaseLayer },
26776d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    { "nativeReplaceBaseContent", "(I)V",
26786d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeReplaceBaseContent },
26796d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    { "nativeCopyBaseContentToPicture", "(Landroid/graphics/Picture;)V",
26806d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeCopyBaseContentToPicture },
26816d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    { "nativeHasContent", "()Z",
26826d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeHasContent },
2683a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeSetSelectionPointer", "(ZFII)V",
268487962ce00229855c098ba12cee8d5c015a835289Cary Clark        (void*) nativeSetSelectionPointer },
268532dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    { "nativeShowCursorTimed", "()V",
268632dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark        (void*) nativeShowCursorTimed },
2687a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeStartSelection", "(II)Z",
2688a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeStartSelection },
26898360bc9c9facd690e42379610cbbb368d3d705efCary Clark    { "nativeStopGL", "()V",
26908360bc9c9facd690e42379610cbbb368d3d705efCary Clark        (void*) nativeStopGL },
2691cc4e3c422964c7d999e8f340057f303140d845ddCary Clark    { "nativeSubtractLayers", "(Landroid/graphics/Rect;)Landroid/graphics/Rect;",
2692cc4e3c422964c7d999e8f340057f303140d845ddCary Clark        (void*) nativeSubtractLayers },
269346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeTextGeneration", "()I",
269446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeTextGeneration },
26958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeUpdateCachedTextfield", "(Ljava/lang/String;I)V",
2696b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark        (void*) nativeUpdateCachedTextfield },
2697a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    {  "nativeWordSelection", "(II)Z",
2698a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeWordSelection },
2699fa768f11d82c34980cce020f442329299efb08caCary Clark    { "nativeGetBlockLeftEdge", "(IIF)I",
2700a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba        (void*) nativeGetBlockLeftEdge },
2701f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    { "nativeScrollableLayer", "(IILandroid/graphics/Rect;Landroid/graphics/Rect;)I",
2702a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        (void*) nativeScrollableLayer },
2703a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    { "nativeScrollLayer", "(III)Z",
2704a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        (void*) nativeScrollLayer },
27054da96b9950ba2e86203aa50be39adcc8431a95a4Ben Murdoch    { "nativeSetExpandedTileBounds", "(Z)V",
27064da96b9950ba2e86203aa50be39adcc8431a95a4Ben Murdoch        (void*) nativeSetExpandedTileBounds },
27078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
27088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2709b92850e0391d674b9c4826b66105aaa3dd3eef96Steve Blockint registerWebView(JNIEnv* env)
27108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
27118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jclass clazz = env->FindClass("android/webkit/WebView");
27128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(clazz, "Unable to find class android/webkit/WebView");
27138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    gWebViewField = env->GetFieldID(clazz, "mNativeClass", "I");
27148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(gWebViewField, "Unable to find android/webkit/WebView.mNativeClass");
2715bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(clazz);
27168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
27178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return jniRegisterNativeMethods(env, "android/webkit/WebView", gJavaWebViewMethods, NELEM(gJavaWebViewMethods));
27188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
27198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
27208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace android
2721