WebView.cpp revision a09e7cf49f43950a799f936bf42a9912d696547b
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"
56a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "TilesManager.h"
5720ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "WebCoreJni.h"
580b84ecf50c01e0fbf7307ca7cae55ab3043c75a3Elliott Slaughter#include "WebRequestContext.h"
5920ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "WebViewCore.h"
6020ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "android_graphics.h"
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef GET_NATIVE_VIEW
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#undef GET_NATIVE_VIEW
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define GET_NATIVE_VIEW(env, obj) ((WebView*)env->GetIntField(obj, gWebViewField))
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6820ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include <JNIUtility.h>
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <JNIHelp.h>
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <jni.h>
7120ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include <ui/KeycodeLabels.h>
72dd7ee22af4f03672fa823324323466054f19a054Iain Merrick#include <wtf/text/AtomicString.h>
7379768700a853c40c66ff0b0591957958667fdd9eSteve Block#include <wtf/text/CString.h>
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7552f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck// Free as much as we possible can
7652f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck#define TRIM_MEMORY_COMPLETE 80
7752f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck// Free a lot (all textures gone)
7852f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck#define TRIM_MEMORY_MODERATE 60
7952f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck// More moderate free (keep bare minimum to restore quickly-ish - possibly clear all textures)
8052f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck#define TRIM_MEMORY_BACKGROUND 40
8152f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck// Moderate free (clear cached tiles, keep visible ones)
8252f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck#define TRIM_MEMORY_UI_HIDDEN 20
83b31c03a968a578cc43e606ede80cefcd07e8ee07John Reck// Duration to show the pressed cursor ring
84b31c03a968a578cc43e606ede80cefcd07e8ee07John Reck#define PRESSED_STATE_DURATION 400
8552f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace android {
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jfieldID gWebViewField;
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//-------------------------------------
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jmethodID GetJMethod(JNIEnv* env, jclass clazz, const char name[], const char signature[])
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID m = env->GetMethodID(clazz, name, signature);
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(m, "Could not find method %s", name);
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m;
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//-------------------------------------
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This class provides JNI for making calls into native code from the UI side
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// of the multi-threaded WebView.
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass WebView
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectenum FrameCachePermission {
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DontAllowNewer,
107f92d7cf56380e421b81212d32a557bda707a9555Steve Block    AllowNewer
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11087962ce00229855c098ba12cee8d5c015a835289Cary Clarkenum DrawExtras { // keep this in sync with WebView.java
11187962ce00229855c098ba12cee8d5c015a835289Cary Clark    DrawExtrasNone = 0,
11287962ce00229855c098ba12cee8d5c015a835289Cary Clark    DrawExtrasFind = 1,
11387962ce00229855c098ba12cee8d5c015a835289Cary Clark    DrawExtrasSelection = 2,
11487962ce00229855c098ba12cee8d5c015a835289Cary Clark    DrawExtrasCursorRing = 3
11587962ce00229855c098ba12cee8d5c015a835289Cary Clark};
11687962ce00229855c098ba12cee8d5c015a835289Cary Clark
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct JavaGlue {
1183bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott    jweak       m_obj;
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_overrideLoading;
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_scrollBy;
121bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins    jmethodID   m_sendMoveFocus;
12246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    jmethodID   m_sendMoveMouse;
12346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    jmethodID   m_sendMoveMouseIfLatest;
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_sendMotionUp;
12595fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins    jmethodID   m_domChangedFocus;
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_getScaledMaxXScroll;
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_getScaledMaxYScroll;
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_getVisibleRect;
12994d36f098e1c65d69568e6fb00124c542e5c7f6fLeon Scroggins    jmethodID   m_rebuildWebTextView;
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_viewInvalidate;
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_viewInvalidateRect;
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_postInvalidateDelayed;
13396eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik    jmethodID   m_pageSwapCallback;
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jfieldID    m_rectLeft;
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jfieldID    m_rectTop;
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_rectWidth;
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_rectHeight;
138ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    jfieldID    m_rectFLeft;
139ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    jfieldID    m_rectFTop;
140ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    jmethodID   m_rectFWidth;
141ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    jmethodID   m_rectFHeight;
14262740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck    jmethodID   m_getTextHandleScale;
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AutoJObject object(JNIEnv* env) {
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return getRealObject(env, m_obj);
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} m_javaGlue;
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14855b4bdbd661ac94fd05ab40de08250bf242d5346John ReckWebView(JNIEnv* env, jobject javaWebView, int viewImpl, WTF::String drawableDir,
14955b4bdbd661ac94fd05ab40de08250bf242d5346John Reck        bool isHighEndGfx) :
15087962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_ring((WebViewCore*) viewImpl)
15155b4bdbd661ac94fd05ab40de08250bf242d5346John Reck    , m_isHighEndGfx(isHighEndGfx)
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jclass clazz = env->FindClass("android/webkit/WebView");
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project //   m_javaGlue = new JavaGlue;
1553bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott    m_javaGlue.m_obj = env->NewWeakGlobalRef(javaWebView);
15651c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins    m_javaGlue.m_scrollBy = GetJMethod(env, clazz, "setContentScrollBy", "(IIZ)Z");
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_overrideLoading = GetJMethod(env, clazz, "overrideLoading", "(Ljava/lang/String;)V");
158bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins    m_javaGlue.m_sendMoveFocus = GetJMethod(env, clazz, "sendMoveFocus", "(II)V");
15946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    m_javaGlue.m_sendMoveMouse = GetJMethod(env, clazz, "sendMoveMouse", "(IIII)V");
16094f12574c74b11db011b994e462f64a112952a47Leon Scroggins    m_javaGlue.m_sendMoveMouseIfLatest = GetJMethod(env, clazz, "sendMoveMouseIfLatest", "(ZZ)V");
161ee260612d8744993644f2e0b0f1fed51423be6dbLeon Scroggins    m_javaGlue.m_sendMotionUp = GetJMethod(env, clazz, "sendMotionUp", "(IIIII)V");
16295fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins    m_javaGlue.m_domChangedFocus = GetJMethod(env, clazz, "domChangedFocus", "()V");
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_getScaledMaxXScroll = GetJMethod(env, clazz, "getScaledMaxXScroll", "()I");
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_getScaledMaxYScroll = GetJMethod(env, clazz, "getScaledMaxYScroll", "()I");
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_getVisibleRect = GetJMethod(env, clazz, "sendOurVisibleRect", "()Landroid/graphics/Rect;");
16694d36f098e1c65d69568e6fb00124c542e5c7f6fLeon Scroggins    m_javaGlue.m_rebuildWebTextView = GetJMethod(env, clazz, "rebuildWebTextView", "()V");
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_viewInvalidate = GetJMethod(env, clazz, "viewInvalidate", "()V");
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_viewInvalidateRect = GetJMethod(env, clazz, "viewInvalidate", "(IIII)V");
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_postInvalidateDelayed = GetJMethod(env, clazz,
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        "viewInvalidateDelayed", "(JIIII)V");
171aeca53d3fee2e94ce013c1dc12648f0335284fbbChris Craik    m_javaGlue.m_pageSwapCallback = GetJMethod(env, clazz, "pageSwapCallback", "(Z)V");
17262740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck    m_javaGlue.m_getTextHandleScale = GetJMethod(env, clazz, "getTextHandleScale", "()F");
173bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(clazz);
174bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jclass rectClass = env->FindClass("android/graphics/Rect");
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(rectClass, "Could not find Rect class");
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_rectLeft = env->GetFieldID(rectClass, "left", "I");
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_rectTop = env->GetFieldID(rectClass, "top", "I");
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_rectWidth = GetJMethod(env, rectClass, "width", "()I");
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_rectHeight = GetJMethod(env, rectClass, "height", "()I");
181bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(rectClass);
182bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block
183ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    jclass rectClassF = env->FindClass("android/graphics/RectF");
184ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    LOG_ASSERT(rectClassF, "Could not find RectF class");
185ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    m_javaGlue.m_rectFLeft = env->GetFieldID(rectClassF, "left", "F");
186ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    m_javaGlue.m_rectFTop = env->GetFieldID(rectClassF, "top", "F");
187ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    m_javaGlue.m_rectFWidth = GetJMethod(env, rectClassF, "width", "()F");
188ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard    m_javaGlue.m_rectFHeight = GetJMethod(env, rectClassF, "height", "()F");
189bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(rectClassF);
190bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    env->SetIntField(javaWebView, gWebViewField, (jint)this);
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewImpl = (WebViewCore*) viewImpl;
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frameCacheUI = 0;
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_navPictureUI = 0;
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_generation = 0;
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_heightCanMeasure = false;
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_lastDx = 0;
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_lastDxTime = 0;
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_ringAnimationEnd = 0;
2006d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    m_baseLayer = 0;
201908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    m_glDrawFunctor = 0;
202d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck    m_isDrawingPaused = false;
203ce03c1c1203621e552d41a8b3831837636f364a9Ben Murdoch    m_buttonSkin = drawableDir.isEmpty() ? 0 : new RenderSkinButton(drawableDir);
204c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger#if USE(ACCELERATED_COMPOSITING)
205c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    m_glWebViewState = 0;
20696eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik    m_pageSwapCallbackRegistered = false;
207c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger#endif
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project~WebView()
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_javaGlue.m_obj)
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        JNIEnv* env = JSC::Bindings::getJNIEnv();
2153bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott        env->DeleteWeakGlobalRef(m_javaGlue.m_obj);
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_javaGlue.m_obj = 0;
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
21875394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
219c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    // We must remove the m_glWebViewState prior to deleting m_baseLayer. If we
220c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    // do not remove it here, we risk having BaseTiles trying to paint using a
221c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    // deallocated base layer.
2228360bc9c9facd690e42379610cbbb368d3d705efCary Clark    stopGL();
22375394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roard#endif
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete m_frameCacheUI;
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete m_navPictureUI;
226b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger    SkSafeUnref(m_baseLayer);
227908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    delete m_glDrawFunctor;
2284de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins    delete m_buttonSkin;
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2318360bc9c9facd690e42379610cbbb368d3d705efCary Clarkvoid stopGL()
2328360bc9c9facd690e42379610cbbb368d3d705efCary Clark{
2338360bc9c9facd690e42379610cbbb368d3d705efCary Clark#if USE(ACCELERATED_COMPOSITING)
2348360bc9c9facd690e42379610cbbb368d3d705efCary Clark    delete m_glWebViewState;
2358360bc9c9facd690e42379610cbbb368d3d705efCary Clark    m_glWebViewState = 0;
2368360bc9c9facd690e42379610cbbb368d3d705efCary Clark#endif
2378360bc9c9facd690e42379610cbbb368d3d705efCary Clark}
2388360bc9c9facd690e42379610cbbb368d3d705efCary Clark
239bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike ReedWebViewCore* getWebViewCore() const {
240bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed    return m_viewImpl;
241bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed}
242bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed
24362740ff35119cc54e82b6af582a01dd34b9e027eJohn Reckfloat getTextHandleScale()
24462740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck{
24562740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck    LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
24662740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck    JNIEnv* env = JSC::Bindings::getJNIEnv();
24762740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck    AutoJObject javaObject = m_javaGlue.object(env);
24862740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck    if (!javaObject.get())
24962740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck        return 0;
25062740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck    float result = env->CallFloatMethod(javaObject.get(), m_javaGlue.m_getTextHandleScale);
25162740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck    checkException(env);
25262740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck    return result;
25362740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck}
25462740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck
25562740ff35119cc54e82b6af582a01dd34b9e027eJohn Reckvoid updateSelectionHandles()
25662740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck{
25762740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck    if (!m_baseLayer)
25862740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck        return;
25962740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck    // Adjust for device density & scale
26062740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck    m_selectText.updateHandleScale(getTextHandleScale());
26162740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck}
26262740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck
263c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark// removes the cursor altogether (e.g., when going to a new page)
264c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clarkvoid clearCursor()
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedRoot* root = getFrameCache(AllowNewer);
267c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    if (!root)
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
269c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    DBG_NAV_LOG("");
27069bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins    m_viewImpl->m_hasCursorBounds = false;
271c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    root->clearCursor();
272c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    viewInvalidate();
273c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark}
274c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark
275c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark// leaves the cursor where it is, but suppresses drawing it
276c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clarkvoid hideCursor()
277c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark{
278c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    CachedRoot* root = getFrameCache(AllowNewer);
279c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    if (!root)
280c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark        return;
281c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    DBG_NAV_LOG("");
2820924a66d1664f53afd148456e5709c471ff7240aCary Clark    hideCursor(root);
283b31c03a968a578cc43e606ede80cefcd07e8ee07John Reck    viewInvalidate();
2840924a66d1664f53afd148456e5709c471ff7240aCary Clark}
2850924a66d1664f53afd148456e5709c471ff7240aCary Clark
2860924a66d1664f53afd148456e5709c471ff7240aCary Clarkvoid hideCursor(CachedRoot* root)
2870924a66d1664f53afd148456e5709c471ff7240aCary Clark{
2880924a66d1664f53afd148456e5709c471ff7240aCary Clark    DBG_NAV_LOG("inner");
28969bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins    m_viewImpl->m_hasCursorBounds = false;
290c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    root->hideCursor();
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if DUMP_NAV_CACHE
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid debugDump()
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedRoot* root = getFrameCache(DontAllowNewer);
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (root)
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        root->mDebug.print();
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
302c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Blockvoid scrollToCurrentMatch()
303c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block{
304c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block    if (!m_findOnPage.currentMatchIsInLayer()) {
305c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block        scrollRectOnScreen(m_findOnPage.currentMatchBounds());
306c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block        return;
307c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block    }
308c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block
309c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block    SkRect matchBounds = m_findOnPage.currentMatchBounds();
3108782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block    LayerAndroid* rootLayer = getFrameCache(DontAllowNewer)->rootLayer();
3118782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block    Layer* layerContainingMatch = rootLayer->findById(m_findOnPage.currentMatchLayerId());
312c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block    ASSERT(layerContainingMatch);
313c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block
3148782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block    // If the match is in a fixed position layer, there's nothing to do.
3158782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block    if (layerContainingMatch->shouldInheritFromRootTransform())
3168782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block        return;
3178782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block
3188782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block    // If the match is in a scrollable layer or a descendant of such a layer,
3198782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block    // there may be a range of of scroll configurations that will make the
3208782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block    // current match visible. Our approach is the simplest possible. Starting at
3218782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block    // the layer in which the match is found, we move up the layer tree,
3228782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block    // scrolling any scrollable layers as little as possible to make sure that
3238782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block    // the current match is in view. This approach has the disadvantage that we
3248782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block    // may end up scrolling a larger number of elements than is necessary, which
3258782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block    // may be visually jarring. However, minimising the number of layers
3268782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block    // scrolled would complicate the code significantly.
3278782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block
3288782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block    bool didScrollLayer = false;
3298782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block    for (Layer* layer = layerContainingMatch; layer; layer = layer->getParent()) {
3308782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block        ASSERT(layer->getParent() || layer == rootLayer);
3318782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block
3328782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block        if (layer->contentIsScrollable()) {
3338782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block            // Convert the match location to layer's local space and scroll it.
3348782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block            // Repeatedly calling Layer::localToAncestor() is inefficient as
3358782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block            // each call repeats part of the calculation. It would be more
3368782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block            // efficient to maintain the transform here and update it on each
3378782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block            // iteration, but that would mean duplicating logic from
3388782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block            // Layer::localToAncestor() and would complicate things.
3398782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block            SkMatrix transform;
3408782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block            layerContainingMatch->localToAncestor(layer, &transform);
3418782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block            SkRect transformedMatchBounds;
3428782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block            transform.mapRect(&transformedMatchBounds, matchBounds);
3438782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block            SkIRect roundedTransformedMatchBounds;
3448782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block            transformedMatchBounds.roundOut(&roundedTransformedMatchBounds);
3458782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block            // Only ScrollableLayerAndroid returns true for contentIsScrollable().
3468782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block            didScrollLayer |= static_cast<ScrollableLayerAndroid*>(layer)->scrollRectIntoView(roundedTransformedMatchBounds);
3478782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block        }
3488782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block    }
3498782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block    // Invalidate, as the call below to scroll the main page may be a no-op.
3508782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block    if (didScrollLayer)
3518782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block        viewInvalidate();
352c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block
353c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block    // Convert matchBounds to the global space so we can scroll the main page.
354c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block    SkMatrix transform;
355c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block    layerContainingMatch->localToGlobal(&transform);
356c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block    SkRect transformedMatchBounds;
357c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block    transform.mapRect(&transformedMatchBounds, matchBounds);
358c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block    SkIRect roundedTransformedMatchBounds;
359c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block    transformedMatchBounds.roundOut(&roundedTransformedMatchBounds);
360c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block    scrollRectOnScreen(roundedTransformedMatchBounds);
361c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block}
362c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block
363afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clarkvoid scrollRectOnScreen(const IntRect& rect)
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
365afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    if (rect.isEmpty())
366afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark        return;
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int dx = 0;
368afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    int left = rect.x();
3691ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block    int right = rect.maxX();
370a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    if (left < m_visibleRect.fLeft)
371a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        dx = left - m_visibleRect.fLeft;
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Only scroll right if the entire width can fit on screen.
373a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    else if (right > m_visibleRect.fRight
374a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount            && right - left < m_visibleRect.width())
375a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        dx = right - m_visibleRect.fRight;
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int dy = 0;
377afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    int top = rect.y();
3781ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block    int bottom = rect.maxY();
379a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    if (top < m_visibleRect.fTop)
380a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        dy = top - m_visibleRect.fTop;
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Only scroll down if the entire height can fit on screen
382a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    else if (bottom > m_visibleRect.fBottom
383a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount            && bottom - top < m_visibleRect.height())
384a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        dy = bottom - m_visibleRect.fBottom;
38551c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins    if ((dx|dy) == 0 || !scrollBy(dx, dy))
386afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark        return;
38751c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins    viewInvalidate();
388e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins}
389e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins
390b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clarkvoid resetCursorRing()
391b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark{
39232dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    m_ringAnimationEnd = 0;
393b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark    m_viewImpl->m_hasCursorBounds = false;
394b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark}
395b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark
39687962ce00229855c098ba12cee8d5c015a835289Cary Clarkbool drawCursorPreamble(CachedRoot* root)
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
398dfadaafc15c16563aba837f05c778eaa2a433a8bJohn Reck    if (!root) return false;
399461c3fcad8dc54fa3240dcc0cb8989e690408578Cary Clark    const CachedFrame* frame;
400461c3fcad8dc54fa3240dcc0cb8989e690408578Cary Clark    const CachedNode* node = root->currentCursor(&frame);
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!node) {
40249e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark        DBG_NAV_LOGV("%s", "!node");
403b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark        resetCursorRing();
40487962ce00229855c098ba12cee8d5c015a835289Cary Clark        return false;
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
406cd8a18fcca4aaa5658aaf236b034516fccac7932Cary Clark    m_ring.setIsButton(node);
4073efa919a7f16fdb717e393f501c50d4844ffaed5Cary Clark    if (node->isHidden()) {
4083efa919a7f16fdb717e393f501c50d4844ffaed5Cary Clark        DBG_NAV_LOG("node->isHidden()");
40946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        m_viewImpl->m_hasCursorBounds = false;
41087962ce00229855c098ba12cee8d5c015a835289Cary Clark        return false;
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
412d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark#if USE(ACCELERATED_COMPOSITING)
413ea684c4f21a0b23ce2ca839f4e9f978d2d02de25Teng-Hui Zhu    if (node->isInLayer() && root->rootLayer()) {
4148782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block        LayerAndroid* layer = root->rootLayer();
415a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        layer->updateFixedLayersPositions(m_visibleRect);
416d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark        layer->updatePositions();
417d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark    }
418d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark#endif
419f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    setVisibleRect(root);
42087962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_ring.m_root = root;
42187962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_ring.m_frame = frame;
42287962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_ring.m_node = node;
42332dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    SkMSec time = SkTime::GetMSecs();
42432dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    m_ring.m_isPressed = time < m_ringAnimationEnd
42532dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark        && m_ringAnimationEnd != UINT_MAX;
42687962ce00229855c098ba12cee8d5c015a835289Cary Clark    return true;
42787962ce00229855c098ba12cee8d5c015a835289Cary Clark}
42887962ce00229855c098ba12cee8d5c015a835289Cary Clark
42987962ce00229855c098ba12cee8d5c015a835289Cary Clarkvoid drawCursorPostamble()
43087962ce00229855c098ba12cee8d5c015a835289Cary Clark{
43132dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    if (m_ringAnimationEnd == UINT_MAX)
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
43387962ce00229855c098ba12cee8d5c015a835289Cary Clark    SkMSec time = SkTime::GetMSecs();
43487962ce00229855c098ba12cee8d5c015a835289Cary Clark    if (time < m_ringAnimationEnd) {
43587962ce00229855c098ba12cee8d5c015a835289Cary Clark        // views assume that inval bounds coordinates are non-negative
43687962ce00229855c098ba12cee8d5c015a835289Cary Clark        WebCore::IntRect invalBounds(0, 0, INT_MAX, INT_MAX);
437ef1adcdfc805d4d13103f6f15cc5b4d96828a60fPatrick Scott        invalBounds.intersect(m_ring.m_absBounds);
43887962ce00229855c098ba12cee8d5c015a835289Cary Clark        postInvalidateDelayed(m_ringAnimationEnd - time, invalBounds);
43987962ce00229855c098ba12cee8d5c015a835289Cary Clark    } else {
4400924a66d1664f53afd148456e5709c471ff7240aCary Clark        hideCursor(const_cast<CachedRoot*>(m_ring.m_root));
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
44287962ce00229855c098ba12cee8d5c015a835289Cary Clark}
443846dd02baeb22227f22c9fda72e48f6810568c14Leon Scroggins
444a5e649bc4d58bf3da959deae077307c487e2a3a6George Mountbool drawGL(WebCore::IntRect& viewRect, WebCore::IntRect* invalRect,
445a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        WebCore::IntRect& webViewRect, int titleBarHeight,
446a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        WebCore::IntRect& clip, float scale, int extras)
447a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
448a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
449beeb8cbb217cca6094affa12a630bd75938909c9George Mount    if (!m_baseLayer)
450a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        return false;
451a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
452e47399f767707497dfc68fc64b14621a8ca9959fTeng-Hui Zhu    if (!m_glWebViewState) {
45382ccbd8ce95211b4b5afad6a653462fd3beb771bJohn Reck        m_glWebViewState = new GLWebViewState();
45455b4bdbd661ac94fd05ab40de08250bf242d5346John Reck        m_glWebViewState->setHighEndGfx(m_isHighEndGfx);
455fcb01cd64de0a1d6f8f8c897d16cc2628be53960John Reck        m_glWebViewState->glExtras()->setCursorRingExtra(&m_ring);
456fcb01cd64de0a1d6f8f8c897d16cc2628be53960John Reck        m_glWebViewState->glExtras()->setFindOnPageExtra(&m_findOnPage);
457e47399f767707497dfc68fc64b14621a8ca9959fTeng-Hui Zhu        if (m_baseLayer->content()) {
45867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard            SkRegion region;
45967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard            SkIRect rect;
46067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard            rect.set(0, 0, m_baseLayer->content()->width(), m_baseLayer->content()->height());
46167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard            region.setRect(rect);
462dfadaafc15c16563aba837f05c778eaa2a433a8bJohn Reck            m_glWebViewState->setBaseLayer(m_baseLayer, region, false, true);
463e47399f767707497dfc68fc64b14621a8ca9959fTeng-Hui Zhu        }
464e47399f767707497dfc68fc64b14621a8ca9959fTeng-Hui Zhu    }
465c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger
466a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    CachedRoot* root = getFrameCache(AllowNewer);
467a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    if (!root) {
468a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        DBG_NAV_LOG("!root");
469a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        if (extras == DrawExtrasCursorRing)
470a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard            resetCursorRing();
471a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    }
472a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    DrawExtra* extra = 0;
473a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    switch (extras) {
474a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        case DrawExtrasFind:
475a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard            extra = &m_findOnPage;
476a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard            break;
477a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        case DrawExtrasSelection:
47862740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck            // This will involve a JNI call, but under normal circumstances we will
47962740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck            // not hit this anyway. Only if USE_JAVA_TEXT_SELECTION is disabled
48062740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck            // in WebView.java will we hit this (so really debug only)
48162740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck            updateSelectionHandles();
482a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard            extra = &m_selectText;
483a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard            break;
484a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        case DrawExtrasCursorRing:
485a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard            if (drawCursorPreamble(root) && m_ring.setup()) {
486b31c03a968a578cc43e606ede80cefcd07e8ee07John Reck                if (m_ring.m_isPressed || m_ringAnimationEnd == UINT_MAX)
487a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard                    extra = &m_ring;
488a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard                drawCursorPostamble();
489a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard            }
490a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard            break;
491a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        default:
492a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard            ;
493a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    }
494a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
495c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    unsigned int pic = m_glWebViewState->currentPictureCounter();
496fcb01cd64de0a1d6f8f8c897d16cc2628be53960John Reck    m_glWebViewState->glExtras()->setDrawExtra(extra);
4970ca8045217bb9b308ddb407d7a9ce17d92d9f9fbNicolas Roard
498d68563709fdf68c90c730155149f6149b084730aJohn Reck    // Make sure we have valid coordinates. We might not have valid coords
499d68563709fdf68c90c730155149f6149b084730aJohn Reck    // if the zoom manager is still initializing. We will be redrawn
500d68563709fdf68c90c730155149f6149b084730aJohn Reck    // once the correct scale is set
501a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    if (!m_visibleRect.hasValidCoordinates())
502d68563709fdf68c90c730155149f6149b084730aJohn Reck        return false;
503aeca53d3fee2e94ce013c1dc12648f0335284fbbChris Craik    bool treesSwapped = false;
504aeca53d3fee2e94ce013c1dc12648f0335284fbbChris Craik    bool newTreeHasAnim = false;
505a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    bool ret = m_glWebViewState->drawGL(viewRect, m_visibleRect, invalRect,
50696eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik                                        webViewRect, titleBarHeight, clip, scale,
507aeca53d3fee2e94ce013c1dc12648f0335284fbbChris Craik                                        &treesSwapped, &newTreeHasAnim);
508aeca53d3fee2e94ce013c1dc12648f0335284fbbChris Craik    if (treesSwapped && (m_pageSwapCallbackRegistered || newTreeHasAnim)) {
50996eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik        m_pageSwapCallbackRegistered = false;
51096eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik        LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
51196eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik        JNIEnv* env = JSC::Bindings::getJNIEnv();
51296eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik        AutoJObject javaObject = m_javaGlue.object(env);
51396eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik        if (javaObject.get()) {
514aeca53d3fee2e94ce013c1dc12648f0335284fbbChris Craik            env->CallVoidMethod(javaObject.get(), m_javaGlue.m_pageSwapCallback, newTreeHasAnim);
51596eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik            checkException(env);
51696eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik        }
51796eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik    }
518c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    if (ret || m_glWebViewState->currentPictureCounter() != pic)
519d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck        return !m_isDrawingPaused;
520a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
521a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    return false;
522a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
523a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
5246d43b9ceb777071c088fe12ee94af80e34816bcfGrace KlobaPictureSet* draw(SkCanvas* canvas, SkColor bgColor, int extras, bool split)
52587962ce00229855c098ba12cee8d5c015a835289Cary Clark{
5266d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    PictureSet* ret = 0;
5276d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (!m_baseLayer) {
5286d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        canvas->drawColor(bgColor);
5296d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return ret;
5306d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    }
5316d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
5326d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    // draw the content of the base layer first
5336d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    PictureSet* content = m_baseLayer->content();
5346d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    int sc = canvas->save(SkCanvas::kClip_SaveFlag);
5356d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    canvas->clipRect(SkRect::MakeLTRB(0, 0, content->width(),
5366d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba                content->height()), SkRegion::kDifference_Op);
5376d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    canvas->drawColor(bgColor);
5386d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    canvas->restoreToCount(sc);
5396d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (content->draw(canvas))
5406d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        ret = split ? new PictureSet(*content) : 0;
5416d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
54287962ce00229855c098ba12cee8d5c015a835289Cary Clark    CachedRoot* root = getFrameCache(AllowNewer);
54387962ce00229855c098ba12cee8d5c015a835289Cary Clark    if (!root) {
54487962ce00229855c098ba12cee8d5c015a835289Cary Clark        DBG_NAV_LOG("!root");
54587962ce00229855c098ba12cee8d5c015a835289Cary Clark        if (extras == DrawExtrasCursorRing)
54687962ce00229855c098ba12cee8d5c015a835289Cary Clark            resetCursorRing();
547846dd02baeb22227f22c9fda72e48f6810568c14Leon Scroggins    }
54887962ce00229855c098ba12cee8d5c015a835289Cary Clark    LayerAndroid mainPicture(m_navPictureUI);
54987962ce00229855c098ba12cee8d5c015a835289Cary Clark    DrawExtra* extra = 0;
55087962ce00229855c098ba12cee8d5c015a835289Cary Clark    switch (extras) {
55187962ce00229855c098ba12cee8d5c015a835289Cary Clark        case DrawExtrasFind:
55287962ce00229855c098ba12cee8d5c015a835289Cary Clark            extra = &m_findOnPage;
55387962ce00229855c098ba12cee8d5c015a835289Cary Clark            break;
55487962ce00229855c098ba12cee8d5c015a835289Cary Clark        case DrawExtrasSelection:
55562740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck            // This will involve a JNI call, but under normal circumstances we will
55662740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck            // not hit this anyway. Only if USE_JAVA_TEXT_SELECTION is disabled
55762740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck            // in WebView.java will we hit this (so really debug only)
55862740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck            updateSelectionHandles();
55987962ce00229855c098ba12cee8d5c015a835289Cary Clark            extra = &m_selectText;
56087962ce00229855c098ba12cee8d5c015a835289Cary Clark            break;
56187962ce00229855c098ba12cee8d5c015a835289Cary Clark        case DrawExtrasCursorRing:
56287962ce00229855c098ba12cee8d5c015a835289Cary Clark            if (drawCursorPreamble(root) && m_ring.setup()) {
56382ccbd8ce95211b4b5afad6a653462fd3beb771bJohn Reck                extra = &m_ring;
56487962ce00229855c098ba12cee8d5c015a835289Cary Clark                drawCursorPostamble();
56587962ce00229855c098ba12cee8d5c015a835289Cary Clark            }
56687962ce00229855c098ba12cee8d5c015a835289Cary Clark            break;
56787962ce00229855c098ba12cee8d5c015a835289Cary Clark        default:
56887962ce00229855c098ba12cee8d5c015a835289Cary Clark            ;
569846dd02baeb22227f22c9fda72e48f6810568c14Leon Scroggins    }
57042051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck#if USE(ACCELERATED_COMPOSITING)
57142051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck    LayerAndroid* compositeLayer = compositeRoot();
57242051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck    if (compositeLayer) {
57342051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck        // call this to be sure we've adjusted for any scrolling or animations
57442051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck        // before we actually draw
575a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        compositeLayer->updateFixedLayersPositions(m_visibleRect);
57642051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck        compositeLayer->updatePositions();
57742051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck        // We have to set the canvas' matrix on the base layer
57842051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck        // (to have fixed layers work as intended)
57942051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck        SkAutoCanvasRestore restore(canvas, true);
58042051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck        m_baseLayer->setMatrix(canvas->getTotalMatrix());
58142051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck        canvas->resetMatrix();
58242051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck        m_baseLayer->draw(canvas);
58342051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck    }
58442051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck#endif
585eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark    if (extra) {
586eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark        IntRect dummy; // inval area, unused for now
587eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark        extra->draw(canvas, &mainPicture, &dummy);
588eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark    }
5896d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    return ret;
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59287962ce00229855c098ba12cee8d5c015a835289Cary Clark
59346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkbool cursorIsTextInput(FrameCachePermission allowNewer)
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
59546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    CachedRoot* root = getFrameCache(allowNewer);
5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!root) {
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DBG_NAV_LOG("!root");
5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
60046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedNode* cursor = root->currentCursor();
601f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark    if (!cursor) {
602f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark        DBG_NAV_LOG("!cursor");
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
604f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark    }
6051d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    DBG_NAV_LOGD("%s", cursor->isTextInput() ? "true" : "false");
6061d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    return cursor->isTextInput();
6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
60946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkvoid cursorRingBounds(WebCore::IntRect* bounds)
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DBG_NAV_LOGD("%s", "");
6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedRoot* root = getFrameCache(DontAllowNewer);
6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (root) {
614f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark        const CachedFrame* cachedFrame;
615f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark        const CachedNode* cachedNode = root->currentCursor(&cachedFrame);
6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (cachedNode) {
617f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark            *bounds = cachedNode->cursorRingBounds(cachedFrame);
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            DBG_NAV_LOGD("bounds={%d,%d,%d,%d}", bounds->x(), bounds->y(),
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                bounds->width(), bounds->height());
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *bounds = WebCore::IntRect(0, 0, 0, 0);
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62636747fa778285f57f2f53c047028be83e9d8776dCary Clarkvoid fixCursor()
62736747fa778285f57f2f53c047028be83e9d8776dCary Clark{
62836747fa778285f57f2f53c047028be83e9d8776dCary Clark    m_viewImpl->gCursorBoundsMutex.lock();
62936747fa778285f57f2f53c047028be83e9d8776dCary Clark    bool hasCursorBounds = m_viewImpl->m_hasCursorBounds;
63036747fa778285f57f2f53c047028be83e9d8776dCary Clark    IntRect bounds = m_viewImpl->m_cursorBounds;
63136747fa778285f57f2f53c047028be83e9d8776dCary Clark    m_viewImpl->gCursorBoundsMutex.unlock();
63236747fa778285f57f2f53c047028be83e9d8776dCary Clark    if (!hasCursorBounds)
63336747fa778285f57f2f53c047028be83e9d8776dCary Clark        return;
63436747fa778285f57f2f53c047028be83e9d8776dCary Clark    int x, y;
63536747fa778285f57f2f53c047028be83e9d8776dCary Clark    const CachedFrame* frame;
636a34b1107b2542fa334fd4db2d58e2df849e083b0Cary Clark    const CachedNode* node = m_frameCacheUI->findAt(bounds, &frame, &x, &y, true);
63736747fa778285f57f2f53c047028be83e9d8776dCary Clark    if (!node)
63836747fa778285f57f2f53c047028be83e9d8776dCary Clark        return;
63936747fa778285f57f2f53c047028be83e9d8776dCary Clark    // require that node have approximately the same bounds (+/- 4) and the same
64036747fa778285f57f2f53c047028be83e9d8776dCary Clark    // center (+/- 2)
64136747fa778285f57f2f53c047028be83e9d8776dCary Clark    IntPoint oldCenter = IntPoint(bounds.x() + (bounds.width() >> 1),
64236747fa778285f57f2f53c047028be83e9d8776dCary Clark        bounds.y() + (bounds.height() >> 1));
643f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    IntRect newBounds = node->bounds(frame);
64436747fa778285f57f2f53c047028be83e9d8776dCary Clark    IntPoint newCenter = IntPoint(newBounds.x() + (newBounds.width() >> 1),
64536747fa778285f57f2f53c047028be83e9d8776dCary Clark        newBounds.y() + (newBounds.height() >> 1));
64636747fa778285f57f2f53c047028be83e9d8776dCary Clark    DBG_NAV_LOGD("oldCenter=(%d,%d) newCenter=(%d,%d)"
64736747fa778285f57f2f53c047028be83e9d8776dCary Clark        " bounds=(%d,%d,w=%d,h=%d) newBounds=(%d,%d,w=%d,h=%d)",
64836747fa778285f57f2f53c047028be83e9d8776dCary Clark        oldCenter.x(), oldCenter.y(), newCenter.x(), newCenter.y(),
64936747fa778285f57f2f53c047028be83e9d8776dCary Clark        bounds.x(), bounds.y(), bounds.width(), bounds.height(),
65036747fa778285f57f2f53c047028be83e9d8776dCary Clark        newBounds.x(), newBounds.y(), newBounds.width(), newBounds.height());
65136747fa778285f57f2f53c047028be83e9d8776dCary Clark    if (abs(oldCenter.x() - newCenter.x()) > 2)
65236747fa778285f57f2f53c047028be83e9d8776dCary Clark        return;
65336747fa778285f57f2f53c047028be83e9d8776dCary Clark    if (abs(oldCenter.y() - newCenter.y()) > 2)
65436747fa778285f57f2f53c047028be83e9d8776dCary Clark        return;
65536747fa778285f57f2f53c047028be83e9d8776dCary Clark    if (abs(bounds.x() - newBounds.x()) > 4)
65636747fa778285f57f2f53c047028be83e9d8776dCary Clark        return;
65736747fa778285f57f2f53c047028be83e9d8776dCary Clark    if (abs(bounds.y() - newBounds.y()) > 4)
65836747fa778285f57f2f53c047028be83e9d8776dCary Clark        return;
6591ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block    if (abs(bounds.maxX() - newBounds.maxX()) > 4)
66036747fa778285f57f2f53c047028be83e9d8776dCary Clark        return;
6611ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block    if (abs(bounds.maxY() - newBounds.maxY()) > 4)
66236747fa778285f57f2f53c047028be83e9d8776dCary Clark        return;
66336747fa778285f57f2f53c047028be83e9d8776dCary Clark    DBG_NAV_LOGD("node=%p frame=%p x=%d y=%d bounds=(%d,%d,w=%d,h=%d)",
66436747fa778285f57f2f53c047028be83e9d8776dCary Clark        node, frame, x, y, bounds.x(), bounds.y(), bounds.width(),
66536747fa778285f57f2f53c047028be83e9d8776dCary Clark        bounds.height());
66636747fa778285f57f2f53c047028be83e9d8776dCary Clark    m_frameCacheUI->setCursor(const_cast<CachedFrame*>(frame),
66736747fa778285f57f2f53c047028be83e9d8776dCary Clark        const_cast<CachedNode*>(node));
66836747fa778285f57f2f53c047028be83e9d8776dCary Clark}
66936747fa778285f57f2f53c047028be83e9d8776dCary Clark
6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCachedRoot* getFrameCache(FrameCachePermission allowNewer)
6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
67246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    if (!m_viewImpl->m_updatedFrameCache) {
67349e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark        DBG_NAV_LOGV("%s", "!m_viewImpl->m_updatedFrameCache");
6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_frameCacheUI;
67546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    }
67646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    if (allowNewer == DontAllowNewer && m_viewImpl->m_lastGeneration < m_generation) {
67746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        DBG_NAV_LOGD("allowNewer==DontAllowNewer m_viewImpl->m_lastGeneration=%d"
67846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark            " < m_generation=%d", m_viewImpl->m_lastGeneration, m_generation);
6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_frameCacheUI;
68046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    }
6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DBG_NAV_LOGD("%s", "m_viewImpl->m_updatedFrameCache == true");
682f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedFrame* oldCursorFrame;
683f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedNode* oldCursorNode = m_frameCacheUI ?
684f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark        m_frameCacheUI->currentCursor(&oldCursorFrame) : 0;
685f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark#if USE(ACCELERATED_COMPOSITING)
686be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark    int layerId = -1;
687be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark    if (oldCursorNode && oldCursorNode->isInLayer()) {
688be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark        const LayerAndroid* cursorLayer = oldCursorFrame->layer(oldCursorNode)
689be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark            ->layer(m_frameCacheUI->rootLayer());
690be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark        if (cursorLayer)
691be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark            layerId = cursorLayer->uniqueId();
692be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark    }
693f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark#endif
694f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    // get id from old layer and use to find new layer
6953a752d13620eb15148e87a028d66932c74a27993Cary Clark    bool oldFocusIsTextInput = false;
6963a752d13620eb15148e87a028d66932c74a27993Cary Clark    void* oldFocusNodePointer = 0;
6973a752d13620eb15148e87a028d66932c74a27993Cary Clark    if (m_frameCacheUI) {
6983a752d13620eb15148e87a028d66932c74a27993Cary Clark        const CachedNode* oldFocus = m_frameCacheUI->currentFocus();
6993a752d13620eb15148e87a028d66932c74a27993Cary Clark        if (oldFocus) {
7003a752d13620eb15148e87a028d66932c74a27993Cary Clark            oldFocusIsTextInput = oldFocus->isTextInput();
7013a752d13620eb15148e87a028d66932c74a27993Cary Clark            oldFocusNodePointer = oldFocus->nodePointer();
7023a752d13620eb15148e87a028d66932c74a27993Cary Clark        }
7033a752d13620eb15148e87a028d66932c74a27993Cary Clark    }
7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewImpl->gFrameCacheMutex.lock();
7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete m_frameCacheUI;
706b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger    SkSafeUnref(m_navPictureUI);
7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewImpl->m_updatedFrameCache = false;
7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frameCacheUI = m_viewImpl->m_frameCacheKit;
7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_navPictureUI = m_viewImpl->m_navPictureKit;
7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewImpl->m_frameCacheKit = 0;
7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewImpl->m_navPictureKit = 0;
7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewImpl->gFrameCacheMutex.unlock();
713f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    if (m_frameCacheUI)
7146d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        m_frameCacheUI->setRootLayer(compositeRoot());
715f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark#if USE(ACCELERATED_COMPOSITING)
716f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    if (layerId >= 0) {
717f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark        LayerAndroid* layer = const_cast<LayerAndroid*>(
718cdd7f6d80774ba3a374f09f22f7cb6bcfca24fa5Mike Reed                                                m_frameCacheUI->rootLayer());
719cdd7f6d80774ba3a374f09f22f7cb6bcfca24fa5Mike Reed        if (layer) {
720a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount            layer->updateFixedLayersPositions(m_visibleRect);
721fa26a8dd531dff44d6cad0700ff32c0bb949392cNicolas Roard            layer->updatePositions();
722cdd7f6d80774ba3a374f09f22f7cb6bcfca24fa5Mike Reed        }
723f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    }
724f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark#endif
72536747fa778285f57f2f53c047028be83e9d8776dCary Clark    fixCursor();
7263a752d13620eb15148e87a028d66932c74a27993Cary Clark    if (oldFocusIsTextInput) {
72795fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins        const CachedNode* newFocus = m_frameCacheUI->currentFocus();
7283a752d13620eb15148e87a028d66932c74a27993Cary Clark        if (newFocus && oldFocusNodePointer != newFocus->nodePointer()
7293a752d13620eb15148e87a028d66932c74a27993Cary Clark                && newFocus->isTextInput()
73095fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins                && newFocus != m_frameCacheUI->currentCursor()) {
73195fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins            // The focus has changed.  We may need to update things.
73295fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins            LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
73395fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins            JNIEnv* env = JSC::Bindings::getJNIEnv();
734b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block            AutoJObject javaObject = m_javaGlue.object(env);
735b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block            if (javaObject.get()) {
736b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block                env->CallVoidMethod(javaObject.get(), m_javaGlue.m_domChangedFocus);
737b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block                checkException(env);
738b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block            }
73995fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins        }
74095fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins    }
741f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    if (oldCursorNode && (!m_frameCacheUI || !m_frameCacheUI->currentCursor()))
74246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        viewInvalidate(); // redraw in case cursor ring is still visible
7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_frameCacheUI;
7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint getScaledMaxXScroll()
7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
750b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
751b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
752b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return 0;
753b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    int result = env->CallIntMethod(javaObject.get(), m_javaGlue.m_getScaledMaxXScroll);
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint getScaledMaxYScroll()
7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
762b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
763b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
764b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return 0;
765b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    int result = env->CallIntMethod(javaObject.get(), m_javaGlue.m_getScaledMaxYScroll);
7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
770af03a3d6830584ef606be2d1c64845815dadb146Cary ClarkIntRect getVisibleRect()
7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
772af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    IntRect rect;
7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
775b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
776b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
777b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return rect;
778b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    jobject jRect = env->CallObjectMethod(javaObject.get(), m_javaGlue.m_getVisibleRect);
7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
780af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    rect.setX(env->GetIntField(jRect, m_javaGlue.m_rectLeft));
7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
782af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    rect.setY(env->GetIntField(jRect, m_javaGlue.m_rectTop));
7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
784af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    rect.setWidth(env->CallIntMethod(jRect, m_javaGlue.m_rectWidth));
7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
786af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    rect.setHeight(env->CallIntMethod(jRect, m_javaGlue.m_rectHeight));
7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    env->DeleteLocalRef(jRect);
7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
790af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    return rect;
7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
793652e9a017a7c5c772361bf57279fae0c26992329Jeff Brownstatic CachedFrame::Direction KeyToDirection(int32_t keyCode)
7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (keyCode) {
796652e9a017a7c5c772361bf57279fae0c26992329Jeff Brown        case AKEYCODE_DPAD_RIGHT:
7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            DBG_NAV_LOGD("keyCode=%s", "right");
7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return CachedFrame::RIGHT;
799652e9a017a7c5c772361bf57279fae0c26992329Jeff Brown        case AKEYCODE_DPAD_LEFT:
8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            DBG_NAV_LOGD("keyCode=%s", "left");
8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return CachedFrame::LEFT;
802652e9a017a7c5c772361bf57279fae0c26992329Jeff Brown        case AKEYCODE_DPAD_DOWN:
8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            DBG_NAV_LOGD("keyCode=%s", "down");
8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return CachedFrame::DOWN;
805652e9a017a7c5c772361bf57279fae0c26992329Jeff Brown        case AKEYCODE_DPAD_UP:
8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            DBG_NAV_LOGD("keyCode=%s", "up");
8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return CachedFrame::UP;
8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
809b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark            DBG_NAV_LOGD("bad key %d sent", keyCode);
8108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return CachedFrame::UNINITIALIZED;
8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
81445b64f60af3cbfa8c78388e35e9b669a0c284bdcBen MurdochWTF::String imageURI(int x, int y)
8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CachedRoot* root = getFrameCache(DontAllowNewer);
81745b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch    return root ? root->imageURI(x, y) : WTF::String();
8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
820f4669cac3858848a9247e801b6106aeae6d406e8Cary Clarkbool cursorWantsKeyEvents()
8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CachedRoot* root = getFrameCache(DontAllowNewer);
8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (root) {
824f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark        const CachedNode* focus = root->currentCursor();
82546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        if (focus)
826f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark            return focus->wantsKeyEvents();
8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
83169bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins
83246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark/* returns true if the key had no effect (neither scrolled nor changed cursor) */
8334ca8bc94f71466d1109bfbb9ef00da3256a0899bCary Clarkbool moveCursor(int keyCode, int count, bool ignoreScroll)
8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedRoot* root = getFrameCache(AllowNewer);
8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!root) {
8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DBG_NAV_LOG("!root");
8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
8398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
84146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    m_viewImpl->m_moveGeneration++;
842652e9a017a7c5c772361bf57279fae0c26992329Jeff Brown    CachedFrame::Direction direction = KeyToDirection(keyCode);
8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CachedFrame* cachedFrame, * oldFrame = 0;
84446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedNode* cursor = root->currentCursor(&oldFrame);
84546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    WebCore::IntPoint cursorLocation = root->cursorLocation();
84646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    DBG_NAV_LOGD("old cursor %d (nativeNode=%p) cursorLocation={%d, %d}",
84746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        cursor ? cursor->index() : 0,
84846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        cursor ? cursor->nodePointer() : 0, cursorLocation.x(), cursorLocation.y());
849f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    WebCore::IntRect visibleRect = setVisibleRect(root);
8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int xMax = getScaledMaxXScroll();
8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int yMax = getScaledMaxYScroll();
8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    root->setMaxScroll(xMax, yMax);
8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CachedNode* cachedNode = 0;
8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int dx = 0;
8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int dy = 0;
8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int counter = count;
8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (--counter >= 0) {
8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebCore::IntPoint scroll = WebCore::IntPoint(0, 0);
85946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        cachedNode = root->moveCursor(direction, &cachedFrame, &scroll);
8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        dx += scroll.x();
8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        dy += scroll.y();
8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
86346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    DBG_NAV_LOGD("new cursor %d (nativeNode=%p) cursorLocation={%d, %d}"
86446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        "bounds={%d,%d,w=%d,h=%d}", cachedNode ? cachedNode->index() : 0,
86546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        cachedNode ? cachedNode->nodePointer() : 0,
86646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark            root->cursorLocation().x(), root->cursorLocation().y(),
867f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark            cachedNode ? cachedNode->bounds(cachedFrame).x() : 0,
868f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark            cachedNode ? cachedNode->bounds(cachedFrame).y() : 0,
869f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark            cachedNode ? cachedNode->bounds(cachedFrame).width() : 0,
870f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark            cachedNode ? cachedNode->bounds(cachedFrame).height() : 0);
8718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If !m_heightCanMeasure (such as in the browser), we want to scroll no
8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // matter what
8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!ignoreScroll && (!m_heightCanMeasure ||
8748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            !cachedNode ||
87546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark            (cursor && cursor->nodePointer() == cachedNode->nodePointer())))
8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (count == 1 && dx != 0 && dy == 0 && -m_lastDx == dx &&
8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                SkTime::GetMSecs() - m_lastDxTime < 1000)
8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            root->checkForJiggle(&dx);
8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DBG_NAV_LOGD("scrollBy %d,%d", dx, dy);
8818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ((dx | dy))
8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            this->scrollBy(dx, dy);
8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_lastDx = dx;
8848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_lastDxTime = SkTime::GetMSecs();
8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool result = false;
8878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (cachedNode) {
88832dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark        showCursorUntimed();
88987962ce00229855c098ba12cee8d5c015a835289Cary Clark        m_viewImpl->updateCursorBounds(root, cachedFrame, cachedNode);
89090bd422df8e04c486d29c4041acf1c4cf7c3b155Leon Scroggins        root->setCursor(const_cast<CachedFrame*>(cachedFrame),
89190bd422df8e04c486d29c4041acf1c4cf7c3b155Leon Scroggins                const_cast<CachedNode*>(cachedNode));
8924ba38126aa5964cd2e1922f3234c745032b5db59Leon Scroggins        const CachedNode* focus = root->currentFocus();
8930a506c68f4ad915ee62e7bf4f22f58b24d078d56Leon Scroggins        bool clearTextEntry = cachedNode != focus && focus
8940a506c68f4ad915ee62e7bf4f22f58b24d078d56Leon Scroggins                && cachedNode->nodePointer() != focus->nodePointer() && focus->isTextInput();
89594f12574c74b11db011b994e462f64a112952a47Leon Scroggins        // Stop painting the caret if the old focus was a text input and so is the new cursor.
89694f12574c74b11db011b994e462f64a112952a47Leon Scroggins        bool stopPaintingCaret = clearTextEntry && cachedNode->wantsKeyEvents();
89794f12574c74b11db011b994e462f64a112952a47Leon Scroggins        sendMoveMouseIfLatest(clearTextEntry, stopPaintingCaret);
8988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
8998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int docHeight = root->documentHeight();
9008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int docWidth = root->documentWidth();
9011ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block        if (visibleRect.maxY() + dy > docHeight)
9021ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block            dy = docHeight - visibleRect.maxY();
9038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (visibleRect.y() + dy < 0)
9048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            dy = -visibleRect.y();
9051ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block        if (visibleRect.maxX() + dx > docWidth)
9061ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block            dx = docWidth - visibleRect.maxX();
9078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (visibleRect.x() < 0)
9088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            dx = -visibleRect.x();
9098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = direction == CachedFrame::LEFT ? dx >= 0 :
9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            direction == CachedFrame::RIGHT ? dx <= 0 :
9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            direction == CachedFrame::UP ? dy >= 0 : dy <= 0;
9128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
9148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid notifyProgressFinished()
9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
91846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    DBG_NAV_LOGD("cursorIsTextInput=%d", cursorIsTextInput(DontAllowNewer));
91995fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins    rebuildWebTextView();
9208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if DEBUG_NAV_UI
9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_frameCacheUI) {
9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const CachedNode* focus = m_frameCacheUI->currentFocus();
9238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DBG_NAV_LOGD("focus %d (nativeNode=%p)",
9248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            focus ? focus->index() : 0,
9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            focus ? focus->nodePointer() : 0);
9268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
9288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst CachedNode* findAt(CachedRoot* root, const WebCore::IntRect& rect,
9318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CachedFrame** framePtr, int* rxPtr, int* ryPtr)
9328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *rxPtr = 0;
9348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *ryPtr = 0;
9358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *framePtr = 0;
9368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!root)
9378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
938f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    setVisibleRect(root);
939f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    return root->findAt(rect, framePtr, rxPtr, ryPtr, true);
940f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark}
941f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark
942f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary ClarkIntRect setVisibleRect(CachedRoot* root)
943f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{
944af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    IntRect visibleRect = getVisibleRect();
945f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    DBG_NAV_LOGD("getVisibleRect %d,%d,%d,%d",
946f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark        visibleRect.x(), visibleRect.y(), visibleRect.width(), visibleRect.height());
9478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    root->setVisibleRect(visibleRect);
948f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    return visibleRect;
9498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid selectBestAt(const WebCore::IntRect& rect)
9528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CachedFrame* frame;
9548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int rx, ry;
955f1610d01f92cb77827d2de13c0ed38554e4f0790Cary Clark    CachedRoot* root = getFrameCache(AllowNewer);
956f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    if (!root)
957f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        return;
9588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CachedNode* node = findAt(root, rect, &frame, &rx, &ry);
9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!node) {
9608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DBG_NAV_LOGD("no nodes found root=%p", root);
961fb934b7878723bd752b558aee4047f9aee19405eTeng-Hui Zhu        root->rootHistory()->setMouseBounds(rect);
96269bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins        m_viewImpl->m_hasCursorBounds = false;
963b41f6483040a4269f2761648f5fa528ca602df5dCary Clark        root->setCursor(0, 0);
96432dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark        viewInvalidate();
96546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    } else {
96646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        DBG_NAV_LOGD("CachedNode:%p (%d)", node, node->index());
967ef1adcdfc805d4d13103f6f15cc5b4d96828a60fPatrick Scott        WebCore::IntRect bounds = node->bounds(frame);
968b0c9a2b4033eca931163e8223d7eaa8889337144Patrick Scott        root->rootHistory()->setMouseBounds(bounds);
96987962ce00229855c098ba12cee8d5c015a835289Cary Clark        m_viewImpl->updateCursorBounds(root, frame, node);
97032dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark        showCursorTimed();
97146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        root->setCursor(const_cast<CachedFrame*>(frame),
97290bd422df8e04c486d29c4041acf1c4cf7c3b155Leon Scroggins                const_cast<CachedNode*>(node));
9738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
97494f12574c74b11db011b994e462f64a112952a47Leon Scroggins    sendMoveMouseIfLatest(false, false);
9758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
977d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkconst CachedNode* m_cacheHitNode;
978d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkconst CachedFrame* m_cacheHitFrame;
979d4924af12855cd19162ba1442a6055664c98ca32Cary Clark
980d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkbool pointInNavCache(int x, int y, int slop)
981d4924af12855cd19162ba1442a6055664c98ca32Cary Clark{
982d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    CachedRoot* root = getFrameCache(AllowNewer);
983d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    if (!root)
984d4924af12855cd19162ba1442a6055664c98ca32Cary Clark        return false;
985d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    IntRect rect = IntRect(x - slop, y - slop, slop * 2, slop * 2);
986d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    int rx, ry;
987d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    return (m_cacheHitNode = findAt(root, rect, &m_cacheHitFrame, &rx, &ry));
988d4924af12855cd19162ba1442a6055664c98ca32Cary Clark}
989d4924af12855cd19162ba1442a6055664c98ca32Cary Clark
99046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkbool motionUp(int x, int y, int slop)
9918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool pageScrolled = false;
993d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    IntRect rect = IntRect(x - slop, y - slop, slop * 2, slop * 2);
9948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int rx, ry;
9958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedRoot* root = getFrameCache(AllowNewer);
99673d131bc28aa2a68fe686ffd9426814448f5da7bCary Clark    if (!root)
997d4924af12855cd19162ba1442a6055664c98ca32Cary Clark        return 0;
998d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    const CachedFrame* frame = 0;
999af3b7507bd6d2b10fce43aa0728b8afcf5cddd86Cary Clark    const CachedNode* result = findAt(root, rect, &frame, &rx, &ry);
1000ec079933211eb47479b2624cb6be72257d178c01Cary Clark    CachedHistory* history = root->rootHistory();
10018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!result) {
10028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DBG_NAV_LOGD("no nodes found root=%p", root);
1003ec079933211eb47479b2624cb6be72257d178c01Cary Clark        history->setNavBounds(rect);
100469bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins        m_viewImpl->m_hasCursorBounds = false;
100569bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins        root->hideCursor();
100669bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins        int dx = root->checkForCenter(x, y);
100769bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins        if (dx) {
100869bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins            scrollBy(dx, 0);
100969bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins            pageScrolled = true;
10108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
101146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        sendMotionUp(frame ? (WebCore::Frame*) frame->framePointer() : 0,
1012ee260612d8744993644f2e0b0f1fed51423be6dbLeon Scroggins            0, x, y);
101346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        viewInvalidate();
10148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return pageScrolled;
10158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
10168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DBG_NAV_LOGD("CachedNode:%p (%d) x=%d y=%d rx=%d ry=%d", result,
10178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result->index(), x, y, rx, ry);
101815f1e443f22288ee82cde972517ebf3cc1153d97Leon Scroggins    WebCore::IntRect navBounds = WebCore::IntRect(rx, ry, 1, 1);
1019ec079933211eb47479b2624cb6be72257d178c01Cary Clark    history->setNavBounds(navBounds);
1020ec079933211eb47479b2624cb6be72257d178c01Cary Clark    history->setMouseBounds(navBounds);
102187962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_viewImpl->updateCursorBounds(root, frame, result);
102246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    root->setCursor(const_cast<CachedFrame*>(frame),
10238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const_cast<CachedNode*>(result));
102432dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    if (result->isSyntheticLink())
102532dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark        overrideUrlLoading(result->getExport());
102632dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    else {
102746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        sendMotionUp(
102834bca311c8205ee40379adac2ef4da01e401600eCary Clark            (WebCore::Frame*) frame->framePointer(),
1029ee260612d8744993644f2e0b0f1fed51423be6dbLeon Scroggins            (WebCore::Node*) result->nodePointer(), rx, ry);
103046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    }
103132dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    if (result->isTextInput() || result->isSelect()
103232dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark            || result->isContentEditable()) {
103332dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark        showCursorUntimed();
103432dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    } else
103532dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark        showCursorTimed();
10368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return pageScrolled;
10378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
103982f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if USE(ACCELERATED_COMPOSITING)
1040f81c672a4f5c06621000a6df0984cde689397d94Cary Clarkstatic const ScrollableLayerAndroid* findScrollableLayer(
1041f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    const LayerAndroid* parent, int x, int y, SkIRect* foundBounds) {
104282f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    SkRect bounds;
104382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    parent->bounds(&bounds);
104482f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    // Check the parent bounds first; this will clip to within a masking layer's
104582f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    // bounds.
1046fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott    if (parent->masksToBounds() && !bounds.contains(x, y))
104782f247bdbb98dd80c44209d87692c650c3704617Patrick Scott        return 0;
104882f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    // Move the hit test local to parent.
104982f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    x -= bounds.fLeft;
105082f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    y -= bounds.fTop;
105182f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    int count = parent->countChildren();
10521a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott    while (count--) {
10531a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott        const LayerAndroid* child = parent->getChild(count);
1054f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        const ScrollableLayerAndroid* result = findScrollableLayer(child, x, y,
1055f81c672a4f5c06621000a6df0984cde689397d94Cary Clark            foundBounds);
1056f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        if (result) {
1057f81c672a4f5c06621000a6df0984cde689397d94Cary Clark            foundBounds->offset(bounds.fLeft, bounds.fTop);
1058f81c672a4f5c06621000a6df0984cde689397d94Cary Clark            if (parent->masksToBounds()) {
1059f81c672a4f5c06621000a6df0984cde689397d94Cary Clark                if (bounds.width() < foundBounds->width())
1060f81c672a4f5c06621000a6df0984cde689397d94Cary Clark                    foundBounds->fRight = foundBounds->fLeft + bounds.width();
1061f81c672a4f5c06621000a6df0984cde689397d94Cary Clark                if (bounds.height() < foundBounds->height())
1062f81c672a4f5c06621000a6df0984cde689397d94Cary Clark                    foundBounds->fBottom = foundBounds->fTop + bounds.height();
1063f81c672a4f5c06621000a6df0984cde689397d94Cary Clark            }
106482f247bdbb98dd80c44209d87692c650c3704617Patrick Scott            return result;
1065f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        }
106682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    }
1067f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    if (parent->contentIsScrollable()) {
1068f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        foundBounds->set(0, 0, bounds.width(), bounds.height());
1069fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott        return static_cast<const ScrollableLayerAndroid*>(parent);
1070f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    }
107182f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    return 0;
107282f247bdbb98dd80c44209d87692c650c3704617Patrick Scott}
107382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif
107482f247bdbb98dd80c44209d87692c650c3704617Patrick Scott
1075f81c672a4f5c06621000a6df0984cde689397d94Cary Clarkint scrollableLayer(int x, int y, SkIRect* layerRect, SkIRect* bounds)
1076a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{
107782f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if USE(ACCELERATED_COMPOSITING)
1078af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    const LayerAndroid* layerRoot = compositeRoot();
1079af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    if (!layerRoot)
1080a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        return 0;
1081f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    const ScrollableLayerAndroid* result = findScrollableLayer(layerRoot, x, y,
1082f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        bounds);
108322e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott    if (result) {
108422e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott        result->getScrollRect(layerRect);
10858598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott        return result->uniqueId();
108622e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott    }
1087a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#endif
1088a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    return 0;
1089a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott}
1090a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott
109170adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craikvoid scrollLayer(int layerId, int x, int y)
109270adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik{
109370adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik    if (m_glWebViewState)
109470adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik        m_glWebViewState->scrollLayer(layerId, x, y);
109570adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik}
109670adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik
1097fa768f11d82c34980cce020f442329299efb08caCary Clarkint getBlockLeftEdge(int x, int y, float scale)
1098a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba{
1099a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba    CachedRoot* root = getFrameCache(AllowNewer);
1100a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba    if (root)
1101fa768f11d82c34980cce020f442329299efb08caCary Clark        return root->getBlockLeftEdge(x, y, scale);
1102a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba    return -1;
1103a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba}
1104a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba
110545b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdochvoid overrideUrlLoading(const WTF::String& url)
11068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
11078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
1108b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
1109b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
1110b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
111179b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block    jstring jName = wtfStringToJstring(env, url);
1112b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_overrideLoading, jName);
11138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    env->DeleteLocalRef(jName);
11148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid setFindIsUp(bool up)
11178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1118afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    DBG_NAV_LOGD("up=%d", up);
11198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewImpl->m_findIsUp = up;
1120afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark}
1121afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark
1122afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clarkvoid setFindIsEmpty()
1123afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark{
1124afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    DBG_NAV_LOG("");
1125afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    m_findOnPage.clearCurrentLocation();
11268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
112832dffb883f56b18019afa7a01b2564b993b3fe8eCary Clarkvoid showCursorTimed()
11298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
113032dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    DBG_NAV_LOG("");
1131b31c03a968a578cc43e606ede80cefcd07e8ee07John Reck    m_ringAnimationEnd = SkTime::GetMSecs() + PRESSED_STATE_DURATION;
113232dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    viewInvalidate();
113332dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark}
113432dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark
113532dffb883f56b18019afa7a01b2564b993b3fe8eCary Clarkvoid showCursorUntimed()
113632dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark{
113732dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    DBG_NAV_LOG("");
11387a69d7c255012f3fcc4d9af040600eac1b2e5c56Cary Clark    m_ring.m_isPressed = false;
113932dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    m_ringAnimationEnd = UINT_MAX;
114032dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    viewInvalidate();
11418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid setHeightCanMeasure(bool measure)
11448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
11458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_heightCanMeasure = measure;
11468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
114887962ce00229855c098ba12cee8d5c015a835289Cary ClarkString getSelection()
11498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
115087962ce00229855c098ba12cee8d5c015a835289Cary Clark    return m_selectText.getSelection();
11518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1153a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkvoid moveSelection(int x, int y)
11548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1155af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    m_selectText.moveSelection(getVisibleRect(), x, y);
11568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1158515943cc7c9a60faa661739271d5fa14fcba9df8Cary ClarkIntPoint selectableText()
1159515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark{
1160515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    const CachedRoot* root = getFrameCache(DontAllowNewer);
1161515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    if (!root)
1162515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark        return IntPoint(0, 0);
1163515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    return m_selectText.selectableText(root);
1164515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark}
1165515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark
1166a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkvoid selectAll()
1167a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
1168af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    m_selectText.selectAll();
1169a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1170a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1171a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkint selectionX()
1172a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
1173a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return m_selectText.selectionX();
1174a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1175a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1176a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkint selectionY()
1177a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
1178a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return m_selectText.selectionY();
1179a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1180a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1181a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkvoid resetSelection()
1182a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
1183a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    m_selectText.reset();
1184a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1185a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1186a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkbool startSelection(int x, int y)
1187a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
1188af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    const CachedRoot* root = getFrameCache(DontAllowNewer);
1189af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    if (!root)
1190af03a3d6830584ef606be2d1c64845815dadb146Cary Clark        return false;
119162740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck    updateSelectionHandles();
1192af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    return m_selectText.startSelection(root, getVisibleRect(), x, y);
1193a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1194a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1195a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkbool wordSelection(int x, int y)
1196a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
11979432ba4878ebf79acd4424398b344c154f452db2Cary Clark    const CachedRoot* root = getFrameCache(DontAllowNewer);
11989432ba4878ebf79acd4424398b344c154f452db2Cary Clark    if (!root)
1199a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        return false;
120062740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck    updateSelectionHandles();
12019432ba4878ebf79acd4424398b344c154f452db2Cary Clark    return m_selectText.wordSelection(root, getVisibleRect(), x, y);
1202a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1203a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1204a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkbool extendSelection(int x, int y)
1205a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
1206af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    m_selectText.extendSelection(getVisibleRect(), x, y);
1207a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return true;
1208a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1209a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1210a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkbool hitSelection(int x, int y)
1211a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
121262740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck    updateSelectionHandles();
1213a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return m_selectText.hitSelection(x, y);
1214a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1215a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1216a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkvoid setExtendSelection()
1217a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
1218a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    m_selectText.setExtendSelection(true);
1219a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
1220a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
1221a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkvoid setSelectionPointer(bool set, float scale, int x, int y)
12228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
122387962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_selectText.setDrawPointer(set);
122487962ce00229855c098ba12cee8d5c015a835289Cary Clark    if (!set)
122587962ce00229855c098ba12cee8d5c015a835289Cary Clark        return;
122687962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_selectText.m_inverseScale = scale;
122787962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_selectText.m_selectX = x;
122887962ce00229855c098ba12cee8d5c015a835289Cary Clark    m_selectText.m_selectY = y;
12298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1231bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scrogginsvoid sendMoveFocus(WebCore::Frame* framePtr, WebCore::Node* nodePtr)
1232bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins{
12335e5962825729a211e093fd615ddc9e5b0bec10bdCary Clark    DBG_NAV_LOGD("framePtr=%p nodePtr=%p", framePtr, nodePtr);
1234bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins    JNIEnv* env = JSC::Bindings::getJNIEnv();
1235b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
1236b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
1237b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
1238b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_sendMoveFocus, (jint) framePtr, (jint) nodePtr);
1239bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins    checkException(env);
1240bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins}
1241bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins
124246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkvoid sendMoveMouse(WebCore::Frame* framePtr, WebCore::Node* nodePtr, int x, int y)
12438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DBG_NAV_LOGD("framePtr=%p nodePtr=%p x=%d y=%d", framePtr, nodePtr, x, y);
12458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
1246b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
1247b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
1248b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
1249b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_sendMoveMouse, reinterpret_cast<jint>(framePtr), reinterpret_cast<jint>(nodePtr), x, y);
12508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
12518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
125394f12574c74b11db011b994e462f64a112952a47Leon Scrogginsvoid sendMoveMouseIfLatest(bool clearTextEntry, bool stopPaintingCaret)
12548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
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    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_sendMoveMouseIfLatest, clearTextEntry, stopPaintingCaret);
12618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
12628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1264b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Blockvoid sendMotionUp(WebCore::Frame* framePtr, WebCore::Node* nodePtr, int x, int y)
12658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1266b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    DBG_NAV_LOGD("m_generation=%d framePtr=%p nodePtr=%p x=%d y=%d", m_generation, framePtr, nodePtr, x, y);
12678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(m_javaGlue.m_obj, "A WebView was not associated with this WebViewNative!");
1268b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block
12698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
1270b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
1271b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
1272b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
1273b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    m_viewImpl->m_touchGeneration = ++m_generation;
1274b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_sendMotionUp, m_generation, (jint) framePtr, (jint) nodePtr, x, y);
12758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
12768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid findNext(bool forward)
12798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1280f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    m_findOnPage.findNext(forward);
1281c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block    scrollToCurrentMatch();
12828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    viewInvalidate();
12838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// With this call, WebView takes ownership of matches, and is responsible for
12868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// deleting it.
1287db17cf1782eab2488aab0933add6c79b21639c08Leon Scrogginsvoid setMatches(WTF::Vector<MatchInfo>* matches, jboolean sameAsLastSearch)
1288db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins{
1289db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    // If this search is the same as the last one, check against the old
1290db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    // location to determine whether to scroll.  If the same word is found
1291db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    // in the same place, then do not scroll.
1292db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    IntRect oldLocation;
1293c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block    bool checkAgainstOldLocation = false;
1294db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    if (sameAsLastSearch && m_findOnPage.isCurrentLocationValid()) {
1295db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins        oldLocation = m_findOnPage.currentMatchBounds();
1296db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins        checkAgainstOldLocation = true;
1297c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block    }
1298db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins
1299f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    m_findOnPage.setMatches(matches);
1300db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins
1301c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block    if (!checkAgainstOldLocation || oldLocation != m_findOnPage.currentMatchBounds())
1302c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block        scrollToCurrentMatch();
13038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    viewInvalidate();
13048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1306afbc0998ef990403a8e17efb9a384a46707a328eLeon Scrogginsint currentMatchIndex()
1307afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins{
1308afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins    return m_findOnPage.currentMatchIndex();
1309afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins}
1310afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins
131151c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scrogginsbool scrollBy(int dx, int dy)
13128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
13148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
1316b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
1317b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
1318b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return false;
1319b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    bool result = env->CallBooleanMethod(javaObject.get(), m_javaGlue.m_scrollBy, dx, dy, true);
13208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
132151c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins    return result;
13228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1324f51a51f6ea307f4311a04aa865a42b233269540bChris Craikvoid setIsScrolling(bool isScrolling)
1325f51a51f6ea307f4311a04aa865a42b233269540bChris Craik{
1326ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch#if USE(ACCELERATED_COMPOSITING)
1327ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch    if (m_glWebViewState)
1328ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch        m_glWebViewState->setIsScrolling(isScrolling);
1329ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch#endif
1330f51a51f6ea307f4311a04aa865a42b233269540bChris Craik}
1331f51a51f6ea307f4311a04aa865a42b233269540bChris Craik
133246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkbool hasCursorNode()
13338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedRoot* root = getFrameCache(DontAllowNewer);
13358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!root) {
13368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DBG_NAV_LOG("!root");
13378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
13388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
133946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedNode* cursorNode = root->currentCursor();
134046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    DBG_NAV_LOGD("cursorNode=%d (nodePointer=%p)",
134146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        cursorNode ? cursorNode->index() : -1,
134246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        cursorNode ? cursorNode->nodePointer() : 0);
134346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return cursorNode;
134446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
134546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
134646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkbool hasFocusNode()
134746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
134846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    CachedRoot* root = getFrameCache(DontAllowNewer);
134946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    if (!root) {
135046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        DBG_NAV_LOG("!root");
13518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
13528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
135346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedNode* focusNode = root->currentFocus();
135446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    DBG_NAV_LOGD("focusNode=%d (nodePointer=%p)",
135546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        focusNode ? focusNode->index() : -1,
135646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        focusNode ? focusNode->nodePointer() : 0);
135746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return focusNode;
13588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
136095fa6e99128685c55e9be6f4362e67c288482a74Leon Scrogginsvoid rebuildWebTextView()
13618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
1363b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
1364b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
1365b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
1366b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_rebuildWebTextView);
13678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
13688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid viewInvalidate()
13718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
1373b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
1374b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
1375b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
1376b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_viewInvalidate);
13778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
13788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid viewInvalidateRect(int l, int t, int r, int b)
13818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
1383b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
1384b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
1385b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
1386b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_viewInvalidateRect, l, r, t, b);
13878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
13888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid postInvalidateDelayed(int64_t delay, const WebCore::IntRect& bounds)
13918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
1393b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
1394b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
1395b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
1396b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_postInvalidateDelayed,
13971ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block        delay, bounds.x(), bounds.y(), bounds.maxX(), bounds.maxY());
13988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
13998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
14008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
140146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkint moveGeneration()
140246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
140346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return m_viewImpl->m_moveGeneration;
140446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
140546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
14066d43b9ceb777071c088fe12ee94af80e34816bcfGrace KlobaLayerAndroid* compositeRoot() const
1407f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{
14086d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    LOG_ASSERT(!m_baseLayer || m_baseLayer->countChildren() == 1,
14096d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba            "base layer can't have more than one child %s", __FUNCTION__);
14106d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (m_baseLayer && m_baseLayer->countChildren() == 1)
14116d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return static_cast<LayerAndroid*>(m_baseLayer->getChild(0));
14126d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    else
14136d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return 0;
1414f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark}
1415f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark
141682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL)
1417a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scottstatic void copyScrollPositionRecursive(const LayerAndroid* from,
1418a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott                                        LayerAndroid* root)
1419a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{
1420a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    if (!from || !root)
1421a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        return;
1422a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    for (int i = 0; i < from->countChildren(); i++) {
1423a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        const LayerAndroid* l = from->getChild(i);
1424a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        if (l->contentIsScrollable()) {
142582f247bdbb98dd80c44209d87692c650c3704617Patrick Scott            const SkPoint& pos = l->getPosition();
142682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott            LayerAndroid* match = root->findById(l->uniqueId());
142782f247bdbb98dd80c44209d87692c650c3704617Patrick Scott            if (match && match->contentIsScrollable())
142882f247bdbb98dd80c44209d87692c650c3704617Patrick Scott                match->setPosition(pos.fX, pos.fY);
1429a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        }
1430a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        copyScrollPositionRecursive(l, root);
1431a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    }
1432a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott}
143382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif
1434a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott
1435af33356e96e56310c66b47b6db913e1a61981ca3Chris Craikvoid registerPageSwapCallback()
1436af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik{
1437af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik    m_pageSwapCallbackRegistered = true;
1438af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik}
1439af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik
14406a3bd3f2b6b5a5c80e5fc1674550456b67e2cc7cShimeng (Simon) Wangvoid setBaseLayer(BaseLayerAndroid* layer, SkRegion& inval, bool showVisualIndicator,
144196eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik                  bool isPictureAfterFirstLayout, bool registerPageSwapCallback)
1442f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{
1443a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
1444c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    if (m_glWebViewState)
14456a3bd3f2b6b5a5c80e5fc1674550456b67e2cc7cShimeng (Simon) Wang        m_glWebViewState->setBaseLayer(layer, inval, showVisualIndicator,
14466a3bd3f2b6b5a5c80e5fc1674550456b67e2cc7cShimeng (Simon) Wang                                       isPictureAfterFirstLayout);
144796eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik    m_pageSwapCallbackRegistered |= registerPageSwapCallback;
1448a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
1449a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
145082f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL)
1451cf6e10e145f44cab3eb70f3782b51a92cf61ae7dShimeng (Simon) Wang    if (layer) {
14527962416088590b8449c81a02f0a882ad29840cbeChris Craik        // TODO: the below tree copies are only necessary in software rendering
145382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott        LayerAndroid* newCompositeRoot = static_cast<LayerAndroid*>(layer->getChild(0));
145482f247bdbb98dd80c44209d87692c650c3704617Patrick Scott        copyScrollPositionRecursive(compositeRoot(), newCompositeRoot);
1455cf6e10e145f44cab3eb70f3782b51a92cf61ae7dShimeng (Simon) Wang    }
145682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif
1457b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger    SkSafeUnref(m_baseLayer);
14586d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    m_baseLayer = layer;
1459f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    CachedRoot* root = getFrameCache(DontAllowNewer);
1460f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    if (!root)
1461f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark        return;
1462f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    root->resetLayers();
14636d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    root->setRootLayer(compositeRoot());
14646d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
14656d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
14668111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reckvoid getTextSelectionRegion(SkRegion *region)
14678111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck{
14680bab4025aed8786cb8307d2eede87f7f21cc0d65John Reck    m_selectText.getSelectionRegion(getVisibleRect(), region, compositeRoot());
14698111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck}
14708111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck
1471e94313e95fb5e08870a58c7a4b593da08cc3d424John Reckvoid getTextSelectionHandles(int* handles)
1472e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck{
1473292448625cf74fa0cbb6776572d5b116d2e7eb15John Reck    m_selectText.getSelectionHandles(handles, compositeRoot());
1474e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck}
1475e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck
14766d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobavoid replaceBaseContent(PictureSet* set)
14776d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
14786d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (!m_baseLayer)
14796d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return;
14806d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    m_baseLayer->setContent(*set);
14816d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    delete set;
14826d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
14836d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
14846d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobavoid copyBaseContentToPicture(SkPicture* picture)
14856d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
14866d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (!m_baseLayer)
14876d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return;
14886d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    PictureSet* content = m_baseLayer->content();
1489e59ed3e2c930c8eeed844aa0365e8285d956a8f2Nicolas Roard    m_baseLayer->drawCanvas(picture->beginRecording(content->width(), content->height(),
14906d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba            SkPicture::kUsePathBoundsForClip_RecordingFlag));
14916d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    picture->endRecording();
14926d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
14936d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
14946d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobabool hasContent() {
14956d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (!m_baseLayer)
14966d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return false;
14976d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    return !m_baseLayer->content()->isEmpty();
1498f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark}
1499f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark
1500908703e420f4931f74527aaeb3d5faabdd66c28aChet Haasevoid setFunctor(Functor* functor) {
1501908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    delete m_glDrawFunctor;
1502908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    m_glDrawFunctor = functor;
1503908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}
1504908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
1505908703e420f4931f74527aaeb3d5faabdd66c28aChet HaaseFunctor* getFunctor() {
1506908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    return m_glDrawFunctor;
1507908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}
1508908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
15094212fae38ffee2bbb657dd19e4ae8b7c735f4953John ReckBaseLayerAndroid* getBaseLayer() {
15104212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck    return m_baseLayer;
15114212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck}
15124212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck
1513a5e649bc4d58bf3da959deae077307c487e2a3a6George Mountvoid setVisibleRect(SkRect& visibleRect) {
1514a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    m_visibleRect = visibleRect;
1515a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount}
1516a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount
1517d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck    bool m_isDrawingPaused;
15188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate: // local state for WebView
15198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // private to getFrameCache(); other functions operate in a different thread
15208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedRoot* m_frameCacheUI; // navigation data ready for use
15218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebViewCore* m_viewImpl;
15228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int m_generation; // associate unique ID with sent kit focus to match with ui
15238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkPicture* m_navPictureUI;
15248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkMSec m_ringAnimationEnd;
15258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Corresponds to the same-named boolean on the java side.
15268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_heightCanMeasure;
15278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int m_lastDx;
15288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkMSec m_lastDxTime;
152987962ce00229855c098ba12cee8d5c015a835289Cary Clark    SelectText m_selectText;
1530f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    FindOnPage m_findOnPage;
153187962ce00229855c098ba12cee8d5c015a835289Cary Clark    CursorRing m_ring;
15326d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    BaseLayerAndroid* m_baseLayer;
1533908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    Functor* m_glDrawFunctor;
1534a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
1535c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    GLWebViewState* m_glWebViewState;
153696eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik    bool m_pageSwapCallbackRegistered;
1537a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
1538ce03c1c1203621e552d41a8b3831837636f364a9Ben Murdoch    RenderSkinButton* m_buttonSkin;
1539a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    SkRect m_visibleRect;
154055b4bdbd661ac94fd05ab40de08250bf242d5346John Reck    bool m_isHighEndGfx;
15418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; // end of WebView class
15428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1543908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
1544908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase/**
1545908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * This class holds a function pointer and parameters for calling drawGL into a specific
1546908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * viewport. The pointer to the Functor will be put on a framework display list to be called
1547908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * when the display list is replayed.
1548908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase */
1549908703e420f4931f74527aaeb3d5faabdd66c28aChet Haaseclass GLDrawFunctor : Functor {
1550908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    public:
1551908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    GLDrawFunctor(WebView* _wvInstance,
1552a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount            bool(WebView::*_funcPtr)(WebCore::IntRect&, WebCore::IntRect*,
1553beeb8cbb217cca6094affa12a630bd75938909c9George Mount                    WebCore::IntRect&, int, WebCore::IntRect&, jfloat, jint),
1554908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase            WebCore::IntRect _viewRect, float _scale, int _extras) {
1555908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        wvInstance = _wvInstance;
1556908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        funcPtr = _funcPtr;
1557908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        viewRect = _viewRect;
1558908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        scale = _scale;
1559908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        extras = _extras;
1560908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    };
156179d8e0434bfe00a793e8041f96dc02ec1d98e694Romain Guy    status_t operator()(int messageId, void* data) {
156279d8e0434bfe00a793e8041f96dc02ec1d98e694Romain Guy        if (viewRect.isEmpty()) {
1563821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase            // NOOP operation if viewport is empty
1564821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase            return 0;
1565821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase        }
156679d8e0434bfe00a793e8041f96dc02ec1d98e694Romain Guy
15679f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard        WebCore::IntRect inval;
15689f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard        int titlebarHeight = webViewRect.height() - viewRect.height();
1569b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner
1570b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner        uirenderer::DrawGlInfo* info = reinterpret_cast<uirenderer::DrawGlInfo*>(data);
1571b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner        WebCore::IntRect localViewRect = viewRect;
1572b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner        if (info->isLayer)
1573b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner            localViewRect.move(-1 * localViewRect.x(), -1 * localViewRect.y());
1574b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner
1575be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard        WebCore::IntRect clip(info->clipLeft, info->clipTop,
1576be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard                              info->clipRight - info->clipLeft,
1577be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard                              info->clipBottom - info->clipTop);
1578e7770b07e6dd4b0edff8725bc0f7a505417dd4f1Teng-Hui Zhu        TilesManager::instance()->shader()->setWebViewMatrix(info->transform, info->isLayer);
1579be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard
1580a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        bool retVal = (*wvInstance.*funcPtr)(localViewRect, &inval, webViewRect,
1581a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount                titlebarHeight, clip, scale, extras);
1582b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy        if (retVal) {
15839f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard            IntRect finalInval;
15849f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard            if (inval.isEmpty()) {
15859f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard                finalInval = webViewRect;
1586be25f896a5c754e96c6c0d4719a79d523293d40fNicolas Roard                retVal = true;
15879f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard            } else {
15889f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard                finalInval.setX(webViewRect.x() + inval.x());
1589be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard                finalInval.setY(webViewRect.y() + titlebarHeight + inval.y());
15909f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard                finalInval.setWidth(inval.width());
15919f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard                finalInval.setHeight(inval.height());
15929f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard            }
1593d1f5cf1ad8b20860bd9cb34a483451019124d1f9Romain Guy            info->dirtyLeft = finalInval.x();
1594d1f5cf1ad8b20860bd9cb34a483451019124d1f9Romain Guy            info->dirtyTop = finalInval.y();
15951ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block            info->dirtyRight = finalInval.maxX();
15961ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block            info->dirtyBottom = finalInval.maxY();
1597b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy        }
1598908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        // return 1 if invalidation needed, 0 otherwise
1599908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        return retVal ? 1 : 0;
1600908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    }
1601908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    void updateRect(WebCore::IntRect& _viewRect) {
1602908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        viewRect = _viewRect;
1603908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    }
1604b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy    void updateViewRect(WebCore::IntRect& _viewRect) {
1605b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy        webViewRect = _viewRect;
1606b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy    }
1607908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    private:
1608908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    WebView* wvInstance;
1609a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    bool (WebView::*funcPtr)(WebCore::IntRect&, WebCore::IntRect*,
1610a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount            WebCore::IntRect&, int, WebCore::IntRect&, float, int);
1611908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    WebCore::IntRect viewRect;
1612b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy    WebCore::IntRect webViewRect;
1613908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    jfloat scale;
1614908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    jint extras;
1615908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase};
1616908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
1617040d9e4815004690561231442e069cc67cba600fChris Craikstatic jobject createJavaRect(JNIEnv* env, int x, int y, int right, int bottom)
1618040d9e4815004690561231442e069cc67cba600fChris Craik{
1619040d9e4815004690561231442e069cc67cba600fChris Craik    jclass rectClass = env->FindClass("android/graphics/Rect");
1620040d9e4815004690561231442e069cc67cba600fChris Craik    jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V");
1621040d9e4815004690561231442e069cc67cba600fChris Craik    jobject rect = env->NewObject(rectClass, init, x, y, right, bottom);
1622040d9e4815004690561231442e069cc67cba600fChris Craik    env->DeleteLocalRef(rectClass);
1623040d9e4815004690561231442e069cc67cba600fChris Craik    return rect;
1624040d9e4815004690561231442e069cc67cba600fChris Craik}
1625040d9e4815004690561231442e069cc67cba600fChris Craik
16268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
16278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Native JNI methods
16288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
1629d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkstatic int nativeCacheHitFramePointer(JNIEnv *env, jobject obj)
1630d4924af12855cd19162ba1442a6055664c98ca32Cary Clark{
1631d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    return reinterpret_cast<int>(GET_NATIVE_VIEW(env, obj)
1632d4924af12855cd19162ba1442a6055664c98ca32Cary Clark            ->m_cacheHitFrame->framePointer());
1633d4924af12855cd19162ba1442a6055664c98ca32Cary Clark}
1634d4924af12855cd19162ba1442a6055664c98ca32Cary Clark
1635d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkstatic jobject nativeCacheHitNodeBounds(JNIEnv *env, jobject obj)
1636d4924af12855cd19162ba1442a6055664c98ca32Cary Clark{
1637d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    WebCore::IntRect bounds = GET_NATIVE_VIEW(env, obj)
1638d4924af12855cd19162ba1442a6055664c98ca32Cary Clark        ->m_cacheHitNode->originalAbsoluteBounds();
1639040d9e4815004690561231442e069cc67cba600fChris Craik    return createJavaRect(env, bounds.x(), bounds.y(),
1640040d9e4815004690561231442e069cc67cba600fChris Craik                          bounds.maxX(), bounds.maxY());
1641d4924af12855cd19162ba1442a6055664c98ca32Cary Clark}
1642d4924af12855cd19162ba1442a6055664c98ca32Cary Clark
1643d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkstatic int nativeCacheHitNodePointer(JNIEnv *env, jobject obj)
1644d4924af12855cd19162ba1442a6055664c98ca32Cary Clark{
1645d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    return reinterpret_cast<int>(GET_NATIVE_VIEW(env, obj)
1646d4924af12855cd19162ba1442a6055664c98ca32Cary Clark        ->m_cacheHitNode->nodePointer());
1647d4924af12855cd19162ba1442a6055664c98ca32Cary Clark}
1648d4924af12855cd19162ba1442a6055664c98ca32Cary Clark
1649b57c3a124715a89ac026e86f4fd3890529525d11Cary Clarkstatic bool nativeCacheHitIsPlugin(JNIEnv *env, jobject obj)
1650b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark{
1651b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark    return GET_NATIVE_VIEW(env, obj)->m_cacheHitNode->isPlugin();
1652b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark}
1653b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark
1654c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clarkstatic void nativeClearCursor(JNIEnv *env, jobject obj)
16558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
16568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
16578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
1658c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    view->clearCursor();
16598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
16608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
166155b4bdbd661ac94fd05ab40de08250bf242d5346John Reckstatic void nativeCreate(JNIEnv *env, jobject obj, int viewImpl,
166255b4bdbd661ac94fd05ab40de08250bf242d5346John Reck                         jstring drawableDir, jboolean isHighEndGfx)
16638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
16644de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins    WTF::String dir = jstringToWtfString(env, drawableDir);
166555b4bdbd661ac94fd05ab40de08250bf242d5346John Reck    WebView* webview = new WebView(env, obj, viewImpl, dir, isHighEndGfx);
16668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // NEED THIS OR SOMETHING LIKE IT!
16678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //Release(obj);
16688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
16698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
167046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jint nativeCursorFramePointer(JNIEnv *env, jobject obj)
167146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
167246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
167346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
167446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    if (!root)
167546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        return 0;
167646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedFrame* frame = 0;
167746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    (void) root->currentCursor(&frame);
167846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return reinterpret_cast<int>(frame ? frame->framePointer() : 0);
167946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
168046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
168146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic const CachedNode* getCursorNode(JNIEnv *env, jobject obj)
168246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
168346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
168446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
168546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return root ? root->currentCursor() : 0;
168646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
168746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
16881d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clarkstatic const CachedNode* getCursorNode(JNIEnv *env, jobject obj,
16891d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    const CachedFrame** frame)
16901d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark{
16911d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
16921d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
16931d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    return root ? root->currentCursor(frame) : 0;
16941d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark}
16951d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark
1696f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clarkstatic const CachedNode* getFocusCandidate(JNIEnv *env, jobject obj,
1697f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedFrame** frame)
1698f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark{
1699f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
1700f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
1701f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark    if (!root)
1702f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark        return 0;
1703f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedNode* cursor = root->currentCursor(frame);
1704f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark    if (cursor && cursor->wantsKeyEvents())
1705f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark        return cursor;
17064ca469897f8dc36063e262faccefe4b8eacb9e7bCary Clark    return root->currentFocus(frame);
1707f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark}
1708f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark
17092194b17e89b2ad4c0624f7612e417db6d69150adLeon Scrogginsstatic bool focusCandidateHasNextTextfield(JNIEnv *env, jobject obj)
17102194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins{
171165966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
171265966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
171365966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    if (!root)
171465966ae193adfef8d40419ad9c11515b0e56f257Cary Clark        return false;
171565966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    const CachedNode* cursor = root->currentCursor();
171665966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    if (!cursor || !cursor->isTextInput())
171765966ae193adfef8d40419ad9c11515b0e56f257Cary Clark        cursor = root->currentFocus();
17182194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins    if (!cursor || !cursor->isTextInput()) return false;
171965966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    return root->nextTextField(cursor, 0);
17202194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins}
17212194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins
172246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic const CachedNode* getFocusNode(JNIEnv *env, jobject obj)
172346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
172446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
172546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
172646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return root ? root->currentFocus() : 0;
172746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
172846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
17298026280044128436d8e89736519a0b32b6540201Cary Clarkstatic const CachedNode* getFocusNode(JNIEnv *env, jobject obj,
17308026280044128436d8e89736519a0b32b6540201Cary Clark    const CachedFrame** frame)
17318026280044128436d8e89736519a0b32b6540201Cary Clark{
17328026280044128436d8e89736519a0b32b6540201Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
17338026280044128436d8e89736519a0b32b6540201Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
17348026280044128436d8e89736519a0b32b6540201Cary Clark    return root ? root->currentFocus(frame) : 0;
17358026280044128436d8e89736519a0b32b6540201Cary Clark}
17368026280044128436d8e89736519a0b32b6540201Cary Clark
17371d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clarkstatic const CachedInput* getInputCandidate(JNIEnv *env, jobject obj)
17381d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark{
17391d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
17401d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
17411d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    if (!root)
17421d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark        return 0;
17431d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    const CachedFrame* frame;
17441d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    const CachedNode* cursor = root->currentCursor(&frame);
17451d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    if (!cursor || !cursor->wantsKeyEvents())
17461d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark        cursor = root->currentFocus(&frame);
17471d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    return cursor ? frame->textInput(cursor) : 0;
17481d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark}
17491d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark
17501cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scrogginsstatic jboolean nativePageShouldHandleShiftAndArrows(JNIEnv *env, jobject obj)
17511cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins{
17521cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    const CachedNode* focus = getFocusNode(env, obj);
17531cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    if (!focus) return false;
17541cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    // Plugins handle shift and arrows whether or not they have focus.
17551cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    if (focus->isPlugin()) return true;
17561cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    const CachedNode* cursor = getCursorNode(env, obj);
17571cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    // ContentEditable nodes should only receive shift and arrows if they have
17581cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    // both the cursor and the focus.
17591cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    return cursor && cursor->nodePointer() == focus->nodePointer()
17601cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins            && cursor->isContentEditable();
17611cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins}
17621cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins
176346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jobject nativeCursorNodeBounds(JNIEnv *env, jobject obj)
176446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
1765f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedFrame* frame;
1766f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedNode* node = getCursorNode(env, obj, &frame);
1767f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    WebCore::IntRect bounds = node ? node->bounds(frame)
176846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        : WebCore::IntRect(0, 0, 0, 0);
1769040d9e4815004690561231442e069cc67cba600fChris Craik    return createJavaRect(env, bounds.x(), bounds.y(),
1770040d9e4815004690561231442e069cc67cba600fChris Craik                          bounds.maxX(), bounds.maxY());
177146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
177246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
177346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jint nativeCursorNodePointer(JNIEnv *env, jobject obj)
177446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
177546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedNode* node = getCursorNode(env, obj);
177646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return reinterpret_cast<int>(node ? node->nodePointer() : 0);
177746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
177846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
177936747fa778285f57f2f53c047028be83e9d8776dCary Clarkstatic jobject nativeCursorPosition(JNIEnv *env, jobject obj)
178036747fa778285f57f2f53c047028be83e9d8776dCary Clark{
178136747fa778285f57f2f53c047028be83e9d8776dCary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
17820181faa1ffede024c2712df19ae7c855a8cf64e3Cary Clark    const CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
178336747fa778285f57f2f53c047028be83e9d8776dCary Clark    WebCore::IntPoint pos = WebCore::IntPoint(0, 0);
178436747fa778285f57f2f53c047028be83e9d8776dCary Clark    if (root)
178519194ea29920c2f7a02d08dfb0416608bc81dbb7Leon Scroggins        root->getSimulatedMousePosition(&pos);
178636747fa778285f57f2f53c047028be83e9d8776dCary Clark    jclass pointClass = env->FindClass("android/graphics/Point");
178736747fa778285f57f2f53c047028be83e9d8776dCary Clark    jmethodID init = env->GetMethodID(pointClass, "<init>", "(II)V");
178836747fa778285f57f2f53c047028be83e9d8776dCary Clark    jobject point = env->NewObject(pointClass, init, pos.x(), pos.y());
1789bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(pointClass);
179036747fa778285f57f2f53c047028be83e9d8776dCary Clark    return point;
179136747fa778285f57f2f53c047028be83e9d8776dCary Clark}
179236747fa778285f57f2f53c047028be83e9d8776dCary Clark
179346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic WebCore::IntRect jrect_to_webrect(JNIEnv* env, jobject obj)
179446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
1795a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    if (obj) {
1796a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        int L, T, R, B;
1797a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        GraphicsJNI::get_jrect(env, obj, &L, &T, &R, &B);
1798a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        return WebCore::IntRect(L, T, R - L, B - T);
1799a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    } else
1800a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        return WebCore::IntRect();
1801a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount}
1802a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount
1803a5e649bc4d58bf3da959deae077307c487e2a3a6George Mountstatic SkRect jrectf_to_rect(JNIEnv* env, jobject obj)
1804a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount{
1805a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    SkRect rect = SkRect::MakeEmpty();
1806a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    if (obj)
1807a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        GraphicsJNI::jrectf_to_rect(env, obj, &rect);
1808a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    return rect;
180946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
181046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
181146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic bool nativeCursorIntersects(JNIEnv *env, jobject obj, jobject visRect)
181246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
1813f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedFrame* frame;
1814f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedNode* node = getCursorNode(env, obj, &frame);
1815f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    return node ? node->bounds(frame).intersects(
1816f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark        jrect_to_webrect(env, visRect)) : false;
181746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
181846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
181946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic bool nativeCursorIsAnchor(JNIEnv *env, jobject obj)
182046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
182146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedNode* node = getCursorNode(env, obj);
182246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return node ? node->isAnchor() : false;
182346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
182446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
182546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic bool nativeCursorIsTextInput(JNIEnv *env, jobject obj)
182646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
182746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedNode* node = getCursorNode(env, obj);
18281d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    return node ? node->isTextInput() : false;
182946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
183046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
183146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jobject nativeCursorText(JNIEnv *env, jobject obj)
183246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
183346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    const CachedNode* node = getCursorNode(env, obj);
183446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    if (!node)
183546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        return 0;
183645b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch    WTF::String value = node->getExport();
183779b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block    return wtfStringToJstring(env, value);
183846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
183946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
18408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeDebugDump(JNIEnv *env, jobject obj)
18418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
18428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if DUMP_NAV_CACHE
18438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
18448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
18458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    view->debugDump();
18468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
18478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
18488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1849a5e649bc4d58bf3da959deae077307c487e2a3a6George Mountstatic jint nativeDraw(JNIEnv *env, jobject obj, jobject canv,
1850a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        jobject visible, jint color,
18516d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        jint extras, jboolean split) {
18528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkCanvas* canvas = GraphicsJNI::getNativeCanvas(env, canv);
1853a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    WebView* webView = GET_NATIVE_VIEW(env, obj);
1854a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    SkRect visibleRect = jrectf_to_rect(env, visible);
1855a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    webView->setVisibleRect(visibleRect);
1856a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    PictureSet* pictureSet = webView->draw(canvas, color, extras, split);
1857a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    return reinterpret_cast<jint>(pictureSet);
18588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
18598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1860223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reckstatic jint nativeGetDrawGLFunction(JNIEnv *env, jobject obj, jint nativeView,
1861223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck                                    jobject jrect, jobject jviewrect,
1862a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount                                    jobject jvisiblerect,
1863223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck                                    jfloat scale, jint extras) {
1864a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    WebCore::IntRect viewRect = jrect_to_webrect(env, jrect);
1865223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck    WebView *wvInstance = (WebView*) nativeView;
1866a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    SkRect visibleRect = jrectf_to_rect(env, jvisiblerect);
1867a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    wvInstance->setVisibleRect(visibleRect);
1868a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount
1869a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    GLDrawFunctor* functor = new GLDrawFunctor(wvInstance,
1870a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount            &android::WebView::drawGL, viewRect, scale, extras);
1871908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    wvInstance->setFunctor((Functor*) functor);
1872b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy
1873a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    WebCore::IntRect webViewRect = jrect_to_webrect(env, jviewrect);
1874b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy    functor->updateViewRect(webViewRect);
1875b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy
1876908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    return (jint)functor;
1877908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}
1878908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
1879a5e649bc4d58bf3da959deae077307c487e2a3a6George Mountstatic void nativeUpdateDrawGLFunction(JNIEnv *env, jobject obj, jobject jrect,
1880a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        jobject jviewrect, jobject jvisiblerect) {
1881908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    WebView *wvInstance = GET_NATIVE_VIEW(env, obj);
1882a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    if (wvInstance) {
1883908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        GLDrawFunctor* functor = (GLDrawFunctor*) wvInstance->getFunctor();
1884a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        if (functor) {
1885a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount            WebCore::IntRect viewRect = jrect_to_webrect(env, jrect);
1886908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase            functor->updateRect(viewRect);
1887b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy
1888a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount            SkRect visibleRect = jrectf_to_rect(env, jvisiblerect);
1889a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount            wvInstance->setVisibleRect(visibleRect);
1890a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount
1891a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount            WebCore::IntRect webViewRect = jrect_to_webrect(env, jviewrect);
1892b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy            functor->updateViewRect(webViewRect);
1893908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        }
1894908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    }
1895908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}
1896908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
1897223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reckstatic bool nativeEvaluateLayersAnimations(JNIEnv *env, jobject obj, jint nativeView)
1898797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{
1899c6151a04881a67d08d91237891fbc7cb82927219John Reck    // only call in software rendering, initialize and evaluate animations
1900797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#if USE(ACCELERATED_COMPOSITING)
1901223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck    LayerAndroid* root = ((WebView*)nativeView)->compositeRoot();
1902c6151a04881a67d08d91237891fbc7cb82927219John Reck    if (root) {
1903c6151a04881a67d08d91237891fbc7cb82927219John Reck        root->initAnimations();
190487962ce00229855c098ba12cee8d5c015a835289Cary Clark        return root->evaluateAnimations();
1905c6151a04881a67d08d91237891fbc7cb82927219John Reck    }
1906797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#endif
1907797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard    return false;
1908797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard}
1909797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard
1910a3a38731f4eeb01d2a42965b6c875d957999969dChris Craikstatic void nativeSetBaseLayer(JNIEnv *env, jobject obj, jint nativeView, jint layer, jobject inval,
19116a3bd3f2b6b5a5c80e5fc1674550456b67e2cc7cShimeng (Simon) Wang                                jboolean showVisualIndicator,
191296eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik                                jboolean isPictureAfterFirstLayout,
191396eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik                                jboolean registerPageSwapCallback)
1914f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{
19156d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    BaseLayerAndroid* layerImpl = reinterpret_cast<BaseLayerAndroid*>(layer);
191667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    SkRegion invalRegion;
191767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    if (inval)
191867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard        invalRegion = *GraphicsJNI::getNativeRegion(env, inval);
1919a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik    ((WebView*)nativeView)->setBaseLayer(layerImpl, invalRegion, showVisualIndicator,
192096eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik                                            isPictureAfterFirstLayout,
192196eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik                                            registerPageSwapCallback);
19226d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
19236d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
1924e94313e95fb5e08870a58c7a4b593da08cc3d424John Reckstatic void nativeGetTextSelectionRegion(JNIEnv *env, jobject obj, jint view,
1925e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck                                         jobject region)
19268111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck{
19278111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck    if (!region)
19288111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck        return;
19298111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck    SkRegion* nregion = GraphicsJNI::getNativeRegion(env, region);
1930e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck    ((WebView*)view)->getTextSelectionRegion(nregion);
1931e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck}
1932e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck
1933e94313e95fb5e08870a58c7a4b593da08cc3d424John Reckstatic void nativeGetSelectionHandles(JNIEnv *env, jobject obj, jint view,
1934e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck                                      jintArray arr)
1935e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck{
1936e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck    int handles[4];
1937e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck    ((WebView*)view)->getTextSelectionHandles(handles);
1938e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck    env->SetIntArrayRegion(arr, 0, 4, handles);
1939e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck    checkException(env);
19408111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck}
19418111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck
19424212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reckstatic BaseLayerAndroid* nativeGetBaseLayer(JNIEnv *env, jobject obj)
19434212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck{
19444212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck    return GET_NATIVE_VIEW(env, obj)->getBaseLayer();
19454212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck}
19464212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck
19476d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic void nativeReplaceBaseContent(JNIEnv *env, jobject obj, jint content)
19486d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
19496d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    PictureSet* set = reinterpret_cast<PictureSet*>(content);
19506d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    GET_NATIVE_VIEW(env, obj)->replaceBaseContent(set);
19516d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
19526d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
19536d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic void nativeCopyBaseContentToPicture(JNIEnv *env, jobject obj, jobject pict)
19546d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
19556d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    SkPicture* picture = GraphicsJNI::getNativePicture(env, pict);
19566d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    GET_NATIVE_VIEW(env, obj)->copyBaseContentToPicture(picture);
19576d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
19586d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
19596d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic bool nativeHasContent(JNIEnv *env, jobject obj)
19606d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
19616d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    return GET_NATIVE_VIEW(env, obj)->hasContent();
1962f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark}
1963f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark
19648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jobject nativeImageURI(JNIEnv *env, jobject obj, jint x, jint y)
19658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
19668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
19678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
196845b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch    WTF::String uri = view->imageURI(x, y);
196979b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block    return wtfStringToJstring(env, uri);
19708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
19718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
197249e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clarkstatic jint nativeFocusCandidateFramePointer(JNIEnv *env, jobject obj)
197349e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark{
197449e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
197549e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
197649e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark    if (!root)
197749e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark        return 0;
197849e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark    const CachedFrame* frame = 0;
197949e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark    const CachedNode* cursor = root->currentCursor(&frame);
198049e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark    if (!cursor || !cursor->wantsKeyEvents())
198149e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark        (void) root->currentFocus(&frame);
198249e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark    return reinterpret_cast<int>(frame ? frame->framePointer() : 0);
198349e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark}
198449e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark
1985bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic bool nativeFocusCandidateIsPassword(JNIEnv *env, jobject obj)
198646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
19871d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    const CachedInput* input = getInputCandidate(env, obj);
1988737a377f81baa2bf868b48f3457cc9a53cea2e6eBen Murdoch    return input && input->getType() == CachedInput::PASSWORD;
198946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
199046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
1991bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic bool nativeFocusCandidateIsRtlText(JNIEnv *env, jobject obj)
199246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
19931d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    const CachedInput* input = getInputCandidate(env, obj);
19941d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    return input ? input->isRtlText() : false;
199546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
199646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
1997bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic bool nativeFocusCandidateIsTextInput(JNIEnv *env, jobject obj)
199846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
1999f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedNode* node = getFocusCandidate(env, obj, 0);
20001d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    return node ? node->isTextInput() : false;
200146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
200246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
2003bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic jint nativeFocusCandidateMaxLength(JNIEnv *env, jobject obj)
200446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
20051d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    const CachedInput* input = getInputCandidate(env, obj);
20061d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    return input ? input->maxLength() : false;
200746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
200846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
2009ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scrogginsstatic jint nativeFocusCandidateIsAutoComplete(JNIEnv *env, jobject obj)
2010ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins{
2011ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins    const CachedInput* input = getInputCandidate(env, obj);
2012ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins    return input ? input->autoComplete() : false;
2013ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins}
2014ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins
2015bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic jobject nativeFocusCandidateName(JNIEnv *env, jobject obj)
201646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
20171d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    const CachedInput* input = getInputCandidate(env, obj);
20181d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    if (!input)
201946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        return 0;
202045b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch    const WTF::String& name = input->name();
202179b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block    return wtfStringToJstring(env, name);
202246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
202346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
2024bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic jobject nativeFocusCandidateNodeBounds(JNIEnv *env, jobject obj)
202546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
2026f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedFrame* frame;
2027f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedNode* node = getFocusCandidate(env, obj, &frame);
202870d105810a06e7cb69f606635b916694ab15b4dcMichael Kolb    WebCore::IntRect bounds = node ? node->originalAbsoluteBounds()
202946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        : WebCore::IntRect(0, 0, 0, 0);
2030040d9e4815004690561231442e069cc67cba600fChris Craik    // Inset the rect by 1 unit, so that the focus candidate's border can still
2031040d9e4815004690561231442e069cc67cba600fChris Craik    // be seen behind it.
2032e5c39206de45588678bf718a8274432068d702f6Michael Kolb    return createJavaRect(env, bounds.x(), bounds.y(),
2033e5c39206de45588678bf718a8274432068d702f6Michael Kolb                          bounds.maxX(), bounds.maxY());
2034390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins}
2035390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins
2036390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scrogginsstatic jobject nativeFocusCandidatePaddingRect(JNIEnv *env, jobject obj)
2037390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins{
2038390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    const CachedInput* input = getInputCandidate(env, obj);
2039390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    if (!input)
2040390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins        return 0;
2041390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    // Note that the Java Rect is being used to pass four integers, rather than
2042390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    // being used as an actual rectangle.
2043390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    return createJavaRect(env, input->paddingLeft(), input->paddingTop(),
2044390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins            input->paddingRight(), input->paddingBottom());
204546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
204646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
2047bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic jint nativeFocusCandidatePointer(JNIEnv *env, jobject obj)
204846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
2049f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedNode* node = getFocusCandidate(env, obj, 0);
205046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return reinterpret_cast<int>(node ? node->nodePointer() : 0);
205146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
205246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
205385e3844824444f304a15e57f62d2e5670fb3bf47Michael Kolbstatic jint nativeFocusCandidateIsSpellcheck(JNIEnv *env, jobject obj)
205485e3844824444f304a15e57f62d2e5670fb3bf47Michael Kolb{
205585e3844824444f304a15e57f62d2e5670fb3bf47Michael Kolb    const CachedInput* input = getInputCandidate(env, obj);
205685e3844824444f304a15e57f62d2e5670fb3bf47Michael Kolb    return input ? input->spellcheck() : false;
205785e3844824444f304a15e57f62d2e5670fb3bf47Michael Kolb}
205885e3844824444f304a15e57f62d2e5670fb3bf47Michael Kolb
2059bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic jobject nativeFocusCandidateText(JNIEnv *env, jobject obj)
206046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
2061f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const CachedNode* node = getFocusCandidate(env, obj, 0);
206246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    if (!node)
206346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        return 0;
206445b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch    WTF::String value = node->getExport();
206579b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block    return wtfStringToJstring(env, value);
206646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
206746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
2068d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scrogginsstatic int nativeFocusCandidateLineHeight(JNIEnv *env, jobject obj)
2069d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins{
2070d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins    const CachedInput* input = getInputCandidate(env, obj);
2071d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins    return input ? input->lineHeight() : 0;
2072d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins}
2073d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins
20743a3b28707d2d6a06afe9f3137e9bedc07246d600Leon Scrogginsstatic jfloat nativeFocusCandidateTextSize(JNIEnv *env, jobject obj)
207546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
20761d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    const CachedInput* input = getInputCandidate(env, obj);
20773a3b28707d2d6a06afe9f3137e9bedc07246d600Leon Scroggins    return input ? input->textSize() : 0.f;
207846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
207946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
208074757b62fce144f27c25cc7744df82cd7411b2dcLeon Scrogginsstatic int nativeFocusCandidateType(JNIEnv *env, jobject obj)
208174757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins{
208274757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins    const CachedInput* input = getInputCandidate(env, obj);
208341c8cd06bd25769654e321d1222856182ebad067Ben Murdoch    if (!input)
2084737a377f81baa2bf868b48f3457cc9a53cea2e6eBen Murdoch        return CachedInput::NONE;
208541c8cd06bd25769654e321d1222856182ebad067Ben Murdoch
208641c8cd06bd25769654e321d1222856182ebad067Ben Murdoch    if (input->isTextArea())
2087737a377f81baa2bf868b48f3457cc9a53cea2e6eBen Murdoch        return CachedInput::TEXT_AREA;
2088737a377f81baa2bf868b48f3457cc9a53cea2e6eBen Murdoch
2089737a377f81baa2bf868b48f3457cc9a53cea2e6eBen Murdoch    return input->getType();
209074757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins}
209174757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins
2092d635c32628b7d9760bf786613cbe3eddf98a1272Michael Kolbstatic int nativeFocusCandidateLayerId(JNIEnv *env, jobject obj)
2093d635c32628b7d9760bf786613cbe3eddf98a1272Michael Kolb{
209407bb72956bf5daf9db5eae4412a68bd95812197fJohn Reck    const CachedFrame* frame = 0;
2095d635c32628b7d9760bf786613cbe3eddf98a1272Michael Kolb    const CachedNode* node = getFocusNode(env, obj, &frame);
209607bb72956bf5daf9db5eae4412a68bd95812197fJohn Reck    if (!node || !frame)
209707bb72956bf5daf9db5eae4412a68bd95812197fJohn Reck        return -1;
209807bb72956bf5daf9db5eae4412a68bd95812197fJohn Reck    const CachedLayer* layer = frame->layer(node);
209907bb72956bf5daf9db5eae4412a68bd95812197fJohn Reck    if (!layer)
2100d635c32628b7d9760bf786613cbe3eddf98a1272Michael Kolb        return -1;
210107bb72956bf5daf9db5eae4412a68bd95812197fJohn Reck    return layer->uniqueId();
2102d635c32628b7d9760bf786613cbe3eddf98a1272Michael Kolb}
2103d635c32628b7d9760bf786613cbe3eddf98a1272Michael Kolb
2104c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenbergerstatic bool nativeFocusIsPlugin(JNIEnv *env, jobject obj)
2105c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger{
2106c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger    const CachedNode* node = getFocusNode(env, obj);
2107c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger    return node ? node->isPlugin() : false;
2108c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger}
2109c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger
21108026280044128436d8e89736519a0b32b6540201Cary Clarkstatic jobject nativeFocusNodeBounds(JNIEnv *env, jobject obj)
21118026280044128436d8e89736519a0b32b6540201Cary Clark{
21128026280044128436d8e89736519a0b32b6540201Cary Clark    const CachedFrame* frame;
21138026280044128436d8e89736519a0b32b6540201Cary Clark    const CachedNode* node = getFocusNode(env, obj, &frame);
21148026280044128436d8e89736519a0b32b6540201Cary Clark    WebCore::IntRect bounds = node ? node->bounds(frame)
21158026280044128436d8e89736519a0b32b6540201Cary Clark        : WebCore::IntRect(0, 0, 0, 0);
2116040d9e4815004690561231442e069cc67cba600fChris Craik    return createJavaRect(env, bounds.x(), bounds.y(),
2117040d9e4815004690561231442e069cc67cba600fChris Craik                          bounds.maxX(), bounds.maxY());
21188026280044128436d8e89736519a0b32b6540201Cary Clark}
21198026280044128436d8e89736519a0b32b6540201Cary Clark
2120539427bc7572dfd8b28579c67460186406dcb246Leon Scrogginsstatic jint nativeFocusNodePointer(JNIEnv *env, jobject obj)
2121539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins{
2122539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins    const CachedNode* node = getFocusNode(env, obj);
2123539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins    return node ? reinterpret_cast<int>(node->nodePointer()) : 0;
2124539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins}
2125539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins
2126f4669cac3858848a9247e801b6106aeae6d406e8Cary Clarkstatic bool nativeCursorWantsKeyEvents(JNIEnv* env, jobject jwebview) {
21278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, jwebview);
21288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
2129f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark    return view->cursorWantsKeyEvents();
21308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2132c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clarkstatic void nativeHideCursor(JNIEnv *env, jobject obj)
2133c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark{
2134c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
2135c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
2136c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    view->hideCursor();
2137c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark}
2138c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark
21398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeSelectBestAt(JNIEnv *env, jobject obj, jobject jrect)
21408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
21428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
21438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::IntRect rect = jrect_to_webrect(env, jrect);
21448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    view->selectBestAt(rect);
21458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21471b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganovstatic void nativeSelectAt(JNIEnv *env, jobject obj, jint x, jint y)
21481b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov{
21491b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov    WebView* view = GET_NATIVE_VIEW(env, obj);
21501b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
21511b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov    WebCore::IntRect rect = IntRect(x, y , 1, 1);
21521b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov    view->selectBestAt(rect);
21531b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov    if (view->hasCursorNode())
21541b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov        view->showCursorUntimed();
21551b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov}
21561b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov
21579092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clarkstatic jobject nativeLayerBounds(JNIEnv* env, jobject obj, jint jlayer)
21589092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark{
21599092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    SkRect r;
21609092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark#if USE(ACCELERATED_COMPOSITING)
21619092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    LayerAndroid* layer = (LayerAndroid*) jlayer;
21629092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    r = layer->bounds();
21639092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark#else
21649092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    r.setEmpty();
21659092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark#endif
21669092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    SkIRect irect;
21679092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    r.round(&irect);
21689092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    jclass rectClass = env->FindClass("android/graphics/Rect");
21699092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V");
21709092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    jobject rect = env->NewObject(rectClass, init, irect.fLeft, irect.fTop,
21719092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark        irect.fRight, irect.fBottom);
21729092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    env->DeleteLocalRef(rectClass);
21739092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    return rect;
21749092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark}
21759092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark
2176cc4e3c422964c7d999e8f340057f303140d845ddCary Clarkstatic jobject nativeSubtractLayers(JNIEnv* env, jobject obj, jobject jrect)
2177cc4e3c422964c7d999e8f340057f303140d845ddCary Clark{
2178cc4e3c422964c7d999e8f340057f303140d845ddCary Clark    SkIRect irect = jrect_to_webrect(env, jrect);
2179cc4e3c422964c7d999e8f340057f303140d845ddCary Clark#if USE(ACCELERATED_COMPOSITING)
21806d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    LayerAndroid* root = GET_NATIVE_VIEW(env, obj)->compositeRoot();
2181cc4e3c422964c7d999e8f340057f303140d845ddCary Clark    if (root) {
2182cc4e3c422964c7d999e8f340057f303140d845ddCary Clark        SkRect rect;
2183cc4e3c422964c7d999e8f340057f303140d845ddCary Clark        rect.set(irect);
2184cc4e3c422964c7d999e8f340057f303140d845ddCary Clark        rect = root->subtractLayers(rect);
2185cc4e3c422964c7d999e8f340057f303140d845ddCary Clark        rect.round(&irect);
2186cc4e3c422964c7d999e8f340057f303140d845ddCary Clark    }
2187cc4e3c422964c7d999e8f340057f303140d845ddCary Clark#endif
2188cc4e3c422964c7d999e8f340057f303140d845ddCary Clark    jclass rectClass = env->FindClass("android/graphics/Rect");
2189cc4e3c422964c7d999e8f340057f303140d845ddCary Clark    jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V");
2190bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    jobject rect = env->NewObject(rectClass, init, irect.fLeft, irect.fTop,
2191cc4e3c422964c7d999e8f340057f303140d845ddCary Clark        irect.fRight, irect.fBottom);
2192bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(rectClass);
2193bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    return rect;
2194cc4e3c422964c7d999e8f340057f303140d845ddCary Clark}
2195cc4e3c422964c7d999e8f340057f303140d845ddCary Clark
219646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jint nativeTextGeneration(JNIEnv *env, jobject obj)
219746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
219846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
219946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
220046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return root ? root->textGeneration() : 0;
220146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
220246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
2203d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkstatic bool nativePointInNavCache(JNIEnv *env, jobject obj,
2204d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    int x, int y, int slop)
2205d4924af12855cd19162ba1442a6055664c98ca32Cary Clark{
2206d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    return GET_NATIVE_VIEW(env, obj)->pointInNavCache(x, y, slop);
2207d4924af12855cd19162ba1442a6055664c98ca32Cary Clark}
2208d4924af12855cd19162ba1442a6055664c98ca32Cary Clark
22098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool nativeMotionUp(JNIEnv *env, jobject obj,
2210d48434fc633d173b549b97b1c614072adc9648a8Cary Clark    int x, int y, int slop)
22118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
22138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
221446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return view->motionUp(x, y, slop);
22158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
221746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic bool nativeHasCursorNode(JNIEnv *env, jobject obj)
22188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
221946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return GET_NATIVE_VIEW(env, obj)->hasCursorNode();
22208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
222246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic bool nativeHasFocusNode(JNIEnv *env, jobject obj)
22238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
222446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    return GET_NATIVE_VIEW(env, obj)->hasFocusNode();
22258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2227bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic bool nativeMoveCursor(JNIEnv *env, jobject obj,
222846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    int key, int count, bool ignoreScroll)
22298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
223146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    DBG_NAV_LOGD("env=%p obj=%p view=%p", env, obj, view);
22328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
22334ca8bc94f71466d1109bfbb9ef00da3256a0899bCary Clark    return view->moveCursor(key, count, ignoreScroll);
22348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2236afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clarkstatic void nativeSetFindIsUp(JNIEnv *env, jobject obj, jboolean isUp)
22378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
22398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
2240afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    view->setFindIsUp(isUp);
2241afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark}
2242afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark
2243afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clarkstatic void nativeSetFindIsEmpty(JNIEnv *env, jobject obj)
2244afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark{
2245afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    GET_NATIVE_VIEW(env, obj)->setFindIsEmpty();
22468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
224832dffb883f56b18019afa7a01b2564b993b3fe8eCary Clarkstatic void nativeShowCursorTimed(JNIEnv *env, jobject obj)
22498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
225032dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    GET_NATIVE_VIEW(env, obj)->showCursorTimed();
22518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeSetHeightCanMeasure(JNIEnv *env, jobject obj, bool measure)
22548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
22568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in nativeSetHeightCanMeasure");
22578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    view->setHeightCanMeasure(measure);
22588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
226046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jobject nativeGetCursorRingBounds(JNIEnv *env, jobject obj)
22618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
22638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
22648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jclass rectClass = env->FindClass("android/graphics/Rect");
22658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(rectClass, "Could not find Rect class!");
22668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V");
22678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(init, "Could not find constructor for Rect");
22688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCore::IntRect webRect;
226946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    view->cursorRingBounds(&webRect);
22708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jobject rect = env->NewObject(rectClass, init, webRect.x(),
22711ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block        webRect.y(), webRect.maxX(), webRect.maxY());
2272bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(rectClass);
22738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return rect;
22748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic int nativeFindAll(JNIEnv *env, jobject obj, jstring findLower,
2277db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins        jstring findUpper, jboolean sameAsLastSearch)
22788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If one or the other is null, do not search.
22808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!(findLower && findUpper))
22818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
22828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Obtain the characters for both the lower case string and the upper case
22838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // string representing the same word.
22848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const jchar* findLowerChars = env->GetStringChars(findLower, 0);
22858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const jchar* findUpperChars = env->GetStringChars(findUpper, 0);
22868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If one or the other is null, do not search.
22878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!(findLowerChars && findUpperChars)) {
22888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (findLowerChars)
22898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            env->ReleaseStringChars(findLower, findLowerChars);
22908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (findUpperChars)
22918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            env->ReleaseStringChars(findUpper, findUpperChars);
22928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        checkException(env);
22938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
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 nativeFindAll");
229746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    CachedRoot* root = view->getFrameCache(WebView::AllowNewer);
22988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!root) {
22998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        env->ReleaseStringChars(findLower, findLowerChars);
23008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        env->ReleaseStringChars(findUpper, findUpperChars);
23018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        checkException(env);
23028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
23038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
23048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int length = env->GetStringLength(findLower);
23058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If the lengths of the strings do not match, then they are not the same
23068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // word, so do not search.
23078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!length || env->GetStringLength(findUpper) != length) {
23088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        env->ReleaseStringChars(findLower, findLowerChars);
23098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        env->ReleaseStringChars(findUpper, findUpperChars);
23108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        checkException(env);
23118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
23128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
23138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int width = root->documentWidth();
23148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int height = root->documentHeight();
23158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Create a FindCanvas, which allows us to fake draw into it so we can
23168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // figure out where our search string is rendered (and how many times).
23178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FindCanvas canvas(width, height, (const UChar*) findLowerChars,
23188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            (const UChar*) findUpperChars, length << 1);
23198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkBitmap bitmap;
23208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bitmap.setConfig(SkBitmap::kARGB_8888_Config, width, height);
23218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    canvas.setBitmapDevice(bitmap);
2322f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    root->draw(canvas);
23238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WTF::Vector<MatchInfo>* matches = canvas.detachMatches();
23248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // With setMatches, the WebView takes ownership of matches
2325db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    view->setMatches(matches, sameAsLastSearch);
23268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    env->ReleaseStringChars(findLower, findLowerChars);
23288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    env->ReleaseStringChars(findUpper, findUpperChars);
23298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
23308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return canvas.found();
23318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeFindNext(JNIEnv *env, jobject obj, bool forward)
23348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
23368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in nativeFindNext");
23378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    view->findNext(forward);
23388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2340afbc0998ef990403a8e17efb9a384a46707a328eLeon Scrogginsstatic int nativeFindIndex(JNIEnv *env, jobject obj)
2341afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins{
2342afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins    WebView* view = GET_NATIVE_VIEW(env, obj);
2343afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins    LOG_ASSERT(view, "view not set in nativeFindIndex");
2344afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins    return view->currentMatchIndex();
2345afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins}
2346afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins
23478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeUpdateCachedTextfield(JNIEnv *env, jobject obj, jstring updatedText, jint generation)
23488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
23508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in nativeUpdateCachedTextfield");
23518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
23528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!root)
23538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
23548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const CachedNode* cachedFocusNode = root->currentFocus();
23551d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark    if (!cachedFocusNode || !cachedFocusNode->isTextInput())
23568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
235727dd31673790eed64c3e0e508bb900671f06bcb3Steve Block    WTF::String webcoreString = jstringToWtfString(env, updatedText);
23588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    (const_cast<CachedNode*>(cachedFocusNode))->setExport(webcoreString);
23598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    root->setTextGeneration(generation);
23608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
23618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2363fa768f11d82c34980cce020f442329299efb08caCary Clarkstatic jint nativeGetBlockLeftEdge(JNIEnv *env, jobject obj, jint x, jint y,
2364fa768f11d82c34980cce020f442329299efb08caCary Clark        jfloat scale)
2365a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba{
2366a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba    WebView* view = GET_NATIVE_VIEW(env, obj);
2367a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
2368a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba    if (!view)
2369a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba        return -1;
2370fa768f11d82c34980cce020f442329299efb08caCary Clark    return view->getBlockLeftEdge(x, y, scale);
2371a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba}
2372a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba
23738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeDestroy(JNIEnv *env, jobject obj)
23748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
2376a09e7cf49f43950a799f936bf42a9912d696547bSteve Block    ALOGD("nativeDestroy view: %p", view);
23778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in nativeDestroy");
23788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete view;
23798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23818360bc9c9facd690e42379610cbbb368d3d705efCary Clarkstatic void nativeStopGL(JNIEnv *env, jobject obj)
23828360bc9c9facd690e42379610cbbb368d3d705efCary Clark{
23838360bc9c9facd690e42379610cbbb368d3d705efCary Clark    GET_NATIVE_VIEW(env, obj)->stopGL();
23848360bc9c9facd690e42379610cbbb368d3d705efCary Clark}
23858360bc9c9facd690e42379610cbbb368d3d705efCary Clark
23868480ea3097f295aeccf7c088a06cceea543238b7Leon Scrogginsstatic bool nativeMoveCursorToNextTextInput(JNIEnv *env, jobject obj)
2387e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins{
2388e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins    WebView* view = GET_NATIVE_VIEW(env, obj);
2389e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins    CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer);
2390e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins    if (!root)
23918480ea3097f295aeccf7c088a06cceea543238b7Leon Scroggins        return false;
239265966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    const CachedNode* current = root->currentCursor();
239365966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    if (!current || !current->isTextInput())
239465966ae193adfef8d40419ad9c11515b0e56f257Cary Clark        current = root->currentFocus();
239565966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    if (!current || !current->isTextInput())
23968480ea3097f295aeccf7c088a06cceea543238b7Leon Scroggins        return false;
2397e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins    const CachedFrame* frame;
239865966ae193adfef8d40419ad9c11515b0e56f257Cary Clark    const CachedNode* next = root->nextTextField(current, &frame);
2399e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins    if (!next)
24008480ea3097f295aeccf7c088a06cceea543238b7Leon Scroggins        return false;
2401f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark    const WebCore::IntRect& bounds = next->bounds(frame);
2402b0c9a2b4033eca931163e8223d7eaa8889337144Patrick Scott    root->rootHistory()->setMouseBounds(bounds);
240387962ce00229855c098ba12cee8d5c015a835289Cary Clark    view->getWebViewCore()->updateCursorBounds(root, frame, next);
240432dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    view->showCursorUntimed();
2405e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins    root->setCursor(const_cast<CachedFrame*>(frame),
2406e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins            const_cast<CachedNode*>(next));
2407bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins    view->sendMoveFocus(static_cast<WebCore::Frame*>(frame->framePointer()),
2408bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins            static_cast<WebCore::Node*>(next->nodePointer()));
24095065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark    if (!next->isInLayer())
24105065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark        view->scrollRectOnScreen(bounds);
2411f74580c1504dcdd43fd15995b0e137982512dba2Leon Scroggins    view->getWebViewCore()->m_moveGeneration++;
24128480ea3097f295aeccf7c088a06cceea543238b7Leon Scroggins    return true;
2413e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins}
2414e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins
241546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic int nativeMoveGeneration(JNIEnv *env, jobject obj)
241646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
241736747fa778285f57f2f53c047028be83e9d8776dCary Clark    WebView* view = GET_NATIVE_VIEW(env, obj);
241836747fa778285f57f2f53c047028be83e9d8776dCary Clark    if (!view)
241936747fa778285f57f2f53c047028be83e9d8776dCary Clark        return 0;
2420b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark    return view->moveGeneration();
242146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
242246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
2423a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeMoveSelection(JNIEnv *env, jobject obj, int x, int y)
24248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2425a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    GET_NATIVE_VIEW(env, obj)->moveSelection(x, y);
2426a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
2427a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
2428a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeResetSelection(JNIEnv *env, jobject obj)
2429a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
2430a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return GET_NATIVE_VIEW(env, obj)->resetSelection();
2431a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
2432a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
2433515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clarkstatic jobject nativeSelectableText(JNIEnv* env, jobject obj)
2434515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark{
2435515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    IntPoint pos = GET_NATIVE_VIEW(env, obj)->selectableText();
2436515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    jclass pointClass = env->FindClass("android/graphics/Point");
2437515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    jmethodID init = env->GetMethodID(pointClass, "<init>", "(II)V");
2438515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    jobject point = env->NewObject(pointClass, init, pos.x(), pos.y());
2439515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    env->DeleteLocalRef(pointClass);
2440515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    return point;
2441515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark}
2442515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark
2443a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeSelectAll(JNIEnv* env, jobject obj)
2444a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
2445a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    GET_NATIVE_VIEW(env, obj)->selectAll();
2446a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
2447a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
2448a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeSetExtendSelection(JNIEnv *env, jobject obj)
2449a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
2450a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    GET_NATIVE_VIEW(env, obj)->setExtendSelection();
2451a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
2452a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
2453a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic jboolean nativeStartSelection(JNIEnv *env, jobject obj, int x, int y)
2454a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
2455a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return GET_NATIVE_VIEW(env, obj)->startSelection(x, y);
2456a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
2457a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
2458a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic jboolean nativeWordSelection(JNIEnv *env, jobject obj, int x, int y)
2459a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
2460a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return GET_NATIVE_VIEW(env, obj)->wordSelection(x, y);
2461a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
2462a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
2463a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeExtendSelection(JNIEnv *env, jobject obj, int x, int y)
2464a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
2465a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    GET_NATIVE_VIEW(env, obj)->extendSelection(x, y);
24668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
24678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jobject nativeGetSelection(JNIEnv *env, jobject obj)
24698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
24708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
24718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
24725e5962825729a211e093fd615ddc9e5b0bec10bdCary Clark    String selection = view->getSelection();
247379b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block    return wtfStringToJstring(env, selection);
24748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
24758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2476a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic jboolean nativeHitSelection(JNIEnv *env, jobject obj, int x, int y)
2477a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
2478a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return GET_NATIVE_VIEW(env, obj)->hitSelection(x, y);
2479a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
2480a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
2481a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic jint nativeSelectionX(JNIEnv *env, jobject obj)
248287962ce00229855c098ba12cee8d5c015a835289Cary Clark{
2483a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return GET_NATIVE_VIEW(env, obj)->selectionX();
248487962ce00229855c098ba12cee8d5c015a835289Cary Clark}
248587962ce00229855c098ba12cee8d5c015a835289Cary Clark
2486a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic jint nativeSelectionY(JNIEnv *env, jobject obj)
2487a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{
2488a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    return GET_NATIVE_VIEW(env, obj)->selectionY();
2489a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark}
2490a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark
2491223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reckstatic void nativeSetSelectionPointer(JNIEnv *env, jobject obj, jint nativeView,
2492223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck                                      jboolean set, jfloat scale, jint x, jint y)
249387962ce00229855c098ba12cee8d5c015a835289Cary Clark{
2494223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck    ((WebView*)nativeView)->setSelectionPointer(set, scale, x, y);
249587962ce00229855c098ba12cee8d5c015a835289Cary Clark}
249687962ce00229855c098ba12cee8d5c015a835289Cary Clark
2497a3a38731f4eeb01d2a42965b6c875d957999969dChris Craikstatic void nativeRegisterPageSwapCallback(JNIEnv *env, jobject obj, jint nativeView)
2498af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik{
2499a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik    ((WebView*)nativeView)->registerPageSwapCallback();
2500a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik}
2501a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik
2502a3a38731f4eeb01d2a42965b6c875d957999969dChris Craikstatic void nativeDiscardAllTextures(JNIEnv *env, jobject obj)
2503a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik{
2504a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik    //discard all textures for debugging/test purposes, but not gl backing memory
2505a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik    bool allTextures = true, deleteGLTextures = false;
2506a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik    TilesManager::instance()->discardTextures(allTextures, deleteGLTextures);
2507af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik}
2508af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik
25095dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic void nativeTileProfilingStart(JNIEnv *env, jobject obj)
25105dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
2511687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    TilesManager::instance()->getProfiler()->start();
25125dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
25135dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
25145dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic float nativeTileProfilingStop(JNIEnv *env, jobject obj)
25155dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
2516687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    return TilesManager::instance()->getProfiler()->stop();
25175dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
25185dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
25195dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic void nativeTileProfilingClear(JNIEnv *env, jobject obj)
25205dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
2521687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    TilesManager::instance()->getProfiler()->clear();
25225dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
25235dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
25245dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic int nativeTileProfilingNumFrames(JNIEnv *env, jobject obj)
25255dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
2526687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    return TilesManager::instance()->getProfiler()->numFrames();
25275dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
25285dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
25295dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic int nativeTileProfilingNumTilesInFrame(JNIEnv *env, jobject obj, int frame)
25305dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
2531687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    return TilesManager::instance()->getProfiler()->numTilesInFrame(frame);
25325dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
25335dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
2534687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craikstatic int nativeTileProfilingGetInt(JNIEnv *env, jobject obj, int frame, int tile, jstring jkey)
25355dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
2536687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    WTF::String key = jstringToWtfString(env, jkey);
2537687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    TileProfileRecord* record = TilesManager::instance()->getProfiler()->getTile(frame, tile);
2538687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik
2539687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    if (key == "left")
2540687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        return record->left;
2541687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    if (key == "top")
2542687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        return record->top;
2543687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    if (key == "right")
2544687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        return record->right;
2545687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    if (key == "bottom")
2546687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        return record->bottom;
2547687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    if (key == "level")
2548687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        return record->level;
2549687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    if (key == "isReady")
2550687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        return record->isReady ? 1 : 0;
2551687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    return -1;
25525dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
25535dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
2554687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craikstatic float nativeTileProfilingGetFloat(JNIEnv *env, jobject obj, int frame, int tile, jstring jkey)
25555dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
2556687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    TileProfileRecord* record = TilesManager::instance()->getProfiler()->getTile(frame, tile);
2557687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    return record->scale;
25585dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
25595dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
25608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_DUMP_DISPLAY_TREE
25618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void dumpToFile(const char text[], void* file) {
25628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fwrite(text, 1, strlen(text), reinterpret_cast<FILE*>(file));
25638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fwrite("\n", 1, 1, reinterpret_cast<FILE*>(file));
25648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
25658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
25668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2567f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roardstatic bool nativeSetProperty(JNIEnv *env, jobject obj, jstring jkey, jstring jvalue)
2568d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck{
2569d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck    WTF::String key = jstringToWtfString(env, jkey);
2570d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck    WTF::String value = jstringToWtfString(env, jvalue);
2571ef238925ea0ba6305e4540aff5c6953503993f3bNicolas Roard    if (key == "inverted") {
2572d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck        if (value == "true")
2573d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck            TilesManager::instance()->setInvertedScreen(true);
2574d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck        else
2575d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck            TilesManager::instance()->setInvertedScreen(false);
2576f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard        return true;
2577d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck    }
25788852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu    else if (key == "inverted_contrast") {
2579bbb9caa2571e2c0192861a336c358412e9e7f0c7Nicolas Roard        float contrast = value.toFloat();
2580bbb9caa2571e2c0192861a336c358412e9e7f0c7Nicolas Roard        TilesManager::instance()->setInvertedScreenContrast(contrast);
2581f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard        return true;
2582bbb9caa2571e2c0192861a336c358412e9e7f0c7Nicolas Roard    }
25838852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu    else if (key == "enable_cpu_upload_path") {
25840960fe0e966317c4728542e9cfaa259523665900Teng-Hui Zhu        TilesManager::instance()->transferQueue()->setTextureUploadType(
25850960fe0e966317c4728542e9cfaa259523665900Teng-Hui Zhu            value == "true" ? CpuUpload : GpuUpload);
25860960fe0e966317c4728542e9cfaa259523665900Teng-Hui Zhu        return true;
25870960fe0e966317c4728542e9cfaa259523665900Teng-Hui Zhu    }
25888852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu    else if (key == "use_minimal_memory") {
25898852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu        TilesManager::instance()->setUseMinimalMemory(value == "true");
25908852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu        return true;
25918852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu    }
2592f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard    return false;
2593d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck}
2594d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck
2595d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reckstatic jstring nativeGetProperty(JNIEnv *env, jobject obj, jstring key)
2596d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck{
2597d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck    return 0;
2598d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck}
2599d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck
260052f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reckstatic void nativeOnTrimMemory(JNIEnv *env, jobject obj, jint level)
260152f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck{
26022986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik    if (TilesManager::hardwareAccelerationEnabled()) {
2603a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik        bool freeAllTextures = (level > TRIM_MEMORY_UI_HIDDEN), glTextures = true;
2604a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik        TilesManager::instance()->discardTextures(freeAllTextures, glTextures);
26052986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik    }
260652f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck}
260752f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck
26088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeDumpDisplayTree(JNIEnv* env, jobject jwebview, jstring jurl)
26098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
26108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_DUMP_DISPLAY_TREE
26118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, jwebview);
26128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
26138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2614bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed    if (view && view->getWebViewCore()) {
2615bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed        FILE* file = fopen(DISPLAY_TREE_LOG_FILE, "w");
2616bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed        if (file) {
2617bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            SkFormatDumper dumper(dumpToFile, file);
2618bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // dump the URL
2619bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            if (jurl) {
2620bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed                const char* str = env->GetStringUTFChars(jurl, 0);
2621bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed                SkDebugf("Dumping %s to %s\n", str, DISPLAY_TREE_LOG_FILE);
2622bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed                dumpToFile(str, file);
2623bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed                env->ReleaseStringUTFChars(jurl, str);
26248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
2625bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // now dump the display tree
2626bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            SkDumpCanvas canvas(&dumper);
2627bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // this will playback the picture into the canvas, which will
2628bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // spew its contents to the dumper
26296d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba            view->draw(&canvas, 0, 0, false);
2630bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // we're done with the file now
2631bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            fwrite("\n", 1, 1, file);
2632bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            fclose(file);
26338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2634859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
26356d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        const LayerAndroid* rootLayer = view->compositeRoot();
2636f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark        if (rootLayer) {
2637859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard          FILE* file = fopen(LAYERS_TREE_LOG_FILE,"w");
2638859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard          if (file) {
2639859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard              rootLayer->dumpLayers(file, 0);
2640859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard              fclose(file);
2641859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard          }
2642859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard        }
2643859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard#endif
26448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
26458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
26468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
26478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2648f81c672a4f5c06621000a6df0984cde689397d94Cary Clarkstatic int nativeScrollableLayer(JNIEnv* env, jobject jwebview, jint x, jint y,
2649f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    jobject rect, jobject bounds)
2650a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{
2651a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    WebView* view = GET_NATIVE_VIEW(env, jwebview);
2652a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
2653f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    SkIRect nativeRect, nativeBounds;
2654f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    int id = view->scrollableLayer(x, y, &nativeRect, &nativeBounds);
2655f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins    if (rect)
2656f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins        GraphicsJNI::irect_to_jrect(nativeRect, env, rect);
2657f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins    if (bounds)
2658f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins        GraphicsJNI::irect_to_jrect(nativeBounds, env, bounds);
265922e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott    return id;
2660a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott}
2661a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott
266222e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scottstatic bool nativeScrollLayer(JNIEnv* env, jobject obj, jint layerId, jint x,
266322e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott        jint y)
2664a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{
2665a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL)
2666a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    WebView* view = GET_NATIVE_VIEW(env, obj);
266770adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik    view->scrollLayer(layerId, x, y);
266870adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik
266970adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik    //TODO: the below only needed for the SW rendering path
26708598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott    LayerAndroid* root = view->compositeRoot();
26718598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott    if (!root)
26728598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott        return false;
26738598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott    LayerAndroid* layer = root->findById(layerId);
2674fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott    if (!layer || !layer->contentIsScrollable())
2675a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        return false;
2676fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott    return static_cast<ScrollableLayerAndroid*>(layer)->scrollTo(x, y);
2677a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#endif
2678a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    return false;
2679a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott}
2680a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott
2681f51a51f6ea307f4311a04aa865a42b233269540bChris Craikstatic void nativeSetIsScrolling(JNIEnv* env, jobject jwebview, jboolean isScrolling)
2682f51a51f6ea307f4311a04aa865a42b233269540bChris Craik{
2683f51a51f6ea307f4311a04aa865a42b233269540bChris Craik    WebView* view = GET_NATIVE_VIEW(env, jwebview);
2684f51a51f6ea307f4311a04aa865a42b233269540bChris Craik    LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
2685f51a51f6ea307f4311a04aa865a42b233269540bChris Craik    view->setIsScrolling(isScrolling);
2686f51a51f6ea307f4311a04aa865a42b233269540bChris Craik}
2687f51a51f6ea307f4311a04aa865a42b233269540bChris Craik
2688c7e578330aece3c556ef205365c24676687223e2Derek Sollenbergerstatic void nativeUseHardwareAccelSkia(JNIEnv*, jobject, jboolean enabled)
2689c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger{
2690c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger    BaseRenderer::setCurrentRendererType(enabled ? BaseRenderer::Ganesh : BaseRenderer::Raster);
2691c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger}
2692c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger
26935e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reckstatic int nativeGetBackgroundColor(JNIEnv* env, jobject obj)
26945e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck{
26955e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck    WebView* view = GET_NATIVE_VIEW(env, obj);
26965e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck    BaseLayerAndroid* baseLayer = view->getBaseLayer();
26975e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck    if (baseLayer) {
26985e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck        WebCore::Color color = baseLayer->getBackgroundColor();
26995e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck        if (color.isValid())
27005e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck            return SkColorSetARGB(color.alpha(), color.red(),
27015e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck                                  color.green(), color.blue());
27025e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck    }
27035e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck    return SK_ColorWHITE;
27045e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck}
27055e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck
2706d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reckstatic void nativeSetPauseDrawing(JNIEnv *env, jobject obj, jint nativeView,
2707d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck                                      jboolean pause)
2708d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck{
2709d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck    ((WebView*)nativeView)->m_isDrawingPaused = pause;
2710d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck}
2711d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck
27128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
27138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * JNI registration
27148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
27158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic JNINativeMethod gJavaWebViewMethods[] = {
2716d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    { "nativeCacheHitFramePointer", "()I",
2717d4924af12855cd19162ba1442a6055664c98ca32Cary Clark        (void*) nativeCacheHitFramePointer },
2718b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark    { "nativeCacheHitIsPlugin", "()Z",
2719b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark        (void*) nativeCacheHitIsPlugin },
2720d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    { "nativeCacheHitNodeBounds", "()Landroid/graphics/Rect;",
2721d4924af12855cd19162ba1442a6055664c98ca32Cary Clark        (void*) nativeCacheHitNodeBounds },
2722d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    { "nativeCacheHitNodePointer", "()I",
2723d4924af12855cd19162ba1442a6055664c98ca32Cary Clark        (void*) nativeCacheHitNodePointer },
2724c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    { "nativeClearCursor", "()V",
2725bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeClearCursor },
272655b4bdbd661ac94fd05ab40de08250bf242d5346John Reck    { "nativeCreate", "(ILjava/lang/String;Z)V",
27278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeCreate },
272846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeCursorFramePointer", "()I",
272946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeCursorFramePointer },
27301cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins    { "nativePageShouldHandleShiftAndArrows", "()Z",
27311cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins        (void*) nativePageShouldHandleShiftAndArrows },
273246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeCursorNodeBounds", "()Landroid/graphics/Rect;",
273346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeCursorNodeBounds },
273446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeCursorNodePointer", "()I",
273546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeCursorNodePointer },
273646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeCursorIntersects", "(Landroid/graphics/Rect;)Z",
273746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeCursorIntersects },
273846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeCursorIsAnchor", "()Z",
273946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeCursorIsAnchor },
274046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeCursorIsTextInput", "()Z",
274146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeCursorIsTextInput },
274236747fa778285f57f2f53c047028be83e9d8776dCary Clark    { "nativeCursorPosition", "()Landroid/graphics/Point;",
274336747fa778285f57f2f53c047028be83e9d8776dCary Clark        (void*) nativeCursorPosition },
274446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeCursorText", "()Ljava/lang/String;",
274546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeCursorText },
2746f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark    { "nativeCursorWantsKeyEvents", "()Z",
2747f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark        (void*)nativeCursorWantsKeyEvents },
27488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeDebugDump", "()V",
27498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeDebugDump },
27508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeDestroy", "()V",
27518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeDestroy },
2752a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    { "nativeDraw", "(Landroid/graphics/Canvas;Landroid/graphics/RectF;IIZ)I",
27536d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeDraw },
2754a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    { "nativeGetDrawGLFunction", "(ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/RectF;FI)I",
2755908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        (void*) nativeGetDrawGLFunction },
2756a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    { "nativeUpdateDrawGLFunction", "(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/RectF;)V",
2757908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        (void*) nativeUpdateDrawGLFunction },
275846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeDumpDisplayTree", "(Ljava/lang/String;)V",
275946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeDumpDisplayTree },
2760223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck    { "nativeEvaluateLayersAnimations", "(I)Z",
276187962ce00229855c098ba12cee8d5c015a835289Cary Clark        (void*) nativeEvaluateLayersAnimations },
2762a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeExtendSelection", "(II)V",
2763a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeExtendSelection },
2764db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins    { "nativeFindAll", "(Ljava/lang/String;Ljava/lang/String;Z)I",
276546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeFindAll },
276646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeFindNext", "(Z)V",
276746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeFindNext },
2768afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins    { "nativeFindIndex", "()I",
2769afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins        (void*) nativeFindIndex},
277049e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark    { "nativeFocusCandidateFramePointer", "()I",
277149e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark        (void*) nativeFocusCandidateFramePointer },
27722194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins    { "nativeFocusCandidateHasNextTextfield", "()Z",
27732194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins        (void*) focusCandidateHasNextTextfield },
2774bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeFocusCandidateIsPassword", "()Z",
2775bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidateIsPassword },
2776bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeFocusCandidateIsRtlText", "()Z",
2777bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidateIsRtlText },
2778bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeFocusCandidateIsTextInput", "()Z",
2779bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidateIsTextInput },
2780d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins    { "nativeFocusCandidateLineHeight", "()I",
2781d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins        (void*) nativeFocusCandidateLineHeight },
2782bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeFocusCandidateMaxLength", "()I",
2783bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidateMaxLength },
2784ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins    { "nativeFocusCandidateIsAutoComplete", "()Z",
2785ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins        (void*) nativeFocusCandidateIsAutoComplete },
278685e3844824444f304a15e57f62d2e5670fb3bf47Michael Kolb    { "nativeFocusCandidateIsSpellcheck", "()Z",
278785e3844824444f304a15e57f62d2e5670fb3bf47Michael Kolb        (void*) nativeFocusCandidateIsSpellcheck },
2788bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeFocusCandidateName", "()Ljava/lang/String;",
2789bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidateName },
2790bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeFocusCandidateNodeBounds", "()Landroid/graphics/Rect;",
2791bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidateNodeBounds },
2792390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins    { "nativeFocusCandidatePaddingRect", "()Landroid/graphics/Rect;",
2793390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins        (void*) nativeFocusCandidatePaddingRect },
2794bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeFocusCandidatePointer", "()I",
2795bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidatePointer },
2796bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeFocusCandidateText", "()Ljava/lang/String;",
2797bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidateText },
27983a3b28707d2d6a06afe9f3137e9bedc07246d600Leon Scroggins    { "nativeFocusCandidateTextSize", "()F",
2799bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeFocusCandidateTextSize },
280074757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins    { "nativeFocusCandidateType", "()I",
280174757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins        (void*) nativeFocusCandidateType },
2802d635c32628b7d9760bf786613cbe3eddf98a1272Michael Kolb    { "nativeFocusCandidateLayerId", "()I",
2803d635c32628b7d9760bf786613cbe3eddf98a1272Michael Kolb        (void*) nativeFocusCandidateLayerId },
2804c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger    { "nativeFocusIsPlugin", "()Z",
2805c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger        (void*) nativeFocusIsPlugin },
28068026280044128436d8e89736519a0b32b6540201Cary Clark    { "nativeFocusNodeBounds", "()Landroid/graphics/Rect;",
28078026280044128436d8e89736519a0b32b6540201Cary Clark        (void*) nativeFocusNodeBounds },
2808539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins    { "nativeFocusNodePointer", "()I",
2809539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins        (void*) nativeFocusNodePointer },
281046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeGetCursorRingBounds", "()Landroid/graphics/Rect;",
281146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeGetCursorRingBounds },
28125e5962825729a211e093fd615ddc9e5b0bec10bdCary Clark    { "nativeGetSelection", "()Ljava/lang/String;",
281346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeGetSelection },
281446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeHasCursorNode", "()Z",
281546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeHasCursorNode },
281646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeHasFocusNode", "()Z",
281746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeHasFocusNode },
2818c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark    { "nativeHideCursor", "()V",
2819c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark        (void*) nativeHideCursor },
2820a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeHitSelection", "(II)Z",
2821a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeHitSelection },
282246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeImageURI", "(II)Ljava/lang/String;",
282346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeImageURI },
28249092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    { "nativeLayerBounds", "(I)Landroid/graphics/Rect;",
28259092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark        (void*) nativeLayerBounds },
2826d48434fc633d173b549b97b1c614072adc9648a8Cary Clark    { "nativeMotionUp", "(III)Z",
28278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeMotionUp },
2828bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins    { "nativeMoveCursor", "(IIZ)Z",
2829bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins        (void*) nativeMoveCursor },
28308480ea3097f295aeccf7c088a06cceea543238b7Leon Scroggins    { "nativeMoveCursorToNextTextInput", "()Z",
2831e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins        (void*) nativeMoveCursorToNextTextInput },
283246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeMoveGeneration", "()I",
283346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeMoveGeneration },
2834a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeMoveSelection", "(II)V",
283546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeMoveSelection },
2836d4924af12855cd19162ba1442a6055664c98ca32Cary Clark    { "nativePointInNavCache", "(III)Z",
2837d4924af12855cd19162ba1442a6055664c98ca32Cary Clark        (void*) nativePointInNavCache },
2838a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeResetSelection", "()V",
2839a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeResetSelection },
2840515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark    { "nativeSelectableText", "()Landroid/graphics/Point;",
2841515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark        (void*) nativeSelectableText },
2842a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeSelectAll", "()V",
2843a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeSelectAll },
28448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeSelectBestAt", "(Landroid/graphics/Rect;)V",
28458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeSelectBestAt },
28461b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov    { "nativeSelectAt", "(II)V",
28471b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov        (void*) nativeSelectAt },
2848a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeSelectionX", "()I",
2849a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeSelectionX },
2850a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeSelectionY", "()I",
2851a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeSelectionY },
2852a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeSetExtendSelection", "()V",
2853a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeSetExtendSelection },
2854afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    { "nativeSetFindIsEmpty", "()V",
2855afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark        (void*) nativeSetFindIsEmpty },
2856afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    { "nativeSetFindIsUp", "(Z)V",
2857d74d4ceff106be90d9eaf08ec191a96bd87a7007Cary Clark        (void*) nativeSetFindIsUp },
28588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeSetHeightCanMeasure", "(Z)V",
28598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeSetHeightCanMeasure },
2860a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik    { "nativeSetBaseLayer", "(IILandroid/graphics/Region;ZZZ)V",
28616d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeSetBaseLayer },
2862e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck    { "nativeGetTextSelectionRegion", "(ILandroid/graphics/Region;)V",
28638111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck        (void*) nativeGetTextSelectionRegion },
2864e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck    { "nativeGetSelectionHandles", "(I[I)V",
2865e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck        (void*) nativeGetSelectionHandles },
28664212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck    { "nativeGetBaseLayer", "()I",
28674212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck        (void*) nativeGetBaseLayer },
28686d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    { "nativeReplaceBaseContent", "(I)V",
28696d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeReplaceBaseContent },
28706d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    { "nativeCopyBaseContentToPicture", "(Landroid/graphics/Picture;)V",
28716d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeCopyBaseContentToPicture },
28726d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    { "nativeHasContent", "()Z",
28736d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeHasContent },
2874223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck    { "nativeSetSelectionPointer", "(IZFII)V",
287587962ce00229855c098ba12cee8d5c015a835289Cary Clark        (void*) nativeSetSelectionPointer },
287632dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark    { "nativeShowCursorTimed", "()V",
287732dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark        (void*) nativeShowCursorTimed },
2878a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik    { "nativeRegisterPageSwapCallback", "(I)V",
2879af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik        (void*) nativeRegisterPageSwapCallback },
2880a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik    { "nativeDiscardAllTextures", "()V",
2881a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik        (void*) nativeDiscardAllTextures },
28825dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik    { "nativeTileProfilingStart", "()V",
28835dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik        (void*) nativeTileProfilingStart },
28845dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik    { "nativeTileProfilingStop", "()F",
28855dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik        (void*) nativeTileProfilingStop },
28865dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik    { "nativeTileProfilingClear", "()V",
28875dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik        (void*) nativeTileProfilingClear },
28885dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik    { "nativeTileProfilingNumFrames", "()I",
28895dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik        (void*) nativeTileProfilingNumFrames },
28905dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik    { "nativeTileProfilingNumTilesInFrame", "(I)I",
28915dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik        (void*) nativeTileProfilingNumTilesInFrame },
2892687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    { "nativeTileProfilingGetInt", "(IILjava/lang/String;)I",
2893687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        (void*) nativeTileProfilingGetInt },
2894687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    { "nativeTileProfilingGetFloat", "(IILjava/lang/String;)F",
2895687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        (void*) nativeTileProfilingGetFloat },
2896a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    { "nativeStartSelection", "(II)Z",
2897a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeStartSelection },
28988360bc9c9facd690e42379610cbbb368d3d705efCary Clark    { "nativeStopGL", "()V",
28998360bc9c9facd690e42379610cbbb368d3d705efCary Clark        (void*) nativeStopGL },
2900cc4e3c422964c7d999e8f340057f303140d845ddCary Clark    { "nativeSubtractLayers", "(Landroid/graphics/Rect;)Landroid/graphics/Rect;",
2901cc4e3c422964c7d999e8f340057f303140d845ddCary Clark        (void*) nativeSubtractLayers },
290246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeTextGeneration", "()I",
290346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeTextGeneration },
29048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeUpdateCachedTextfield", "(Ljava/lang/String;I)V",
2905b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark        (void*) nativeUpdateCachedTextfield },
2906a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark    {  "nativeWordSelection", "(II)Z",
2907a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark        (void*) nativeWordSelection },
2908fa768f11d82c34980cce020f442329299efb08caCary Clark    { "nativeGetBlockLeftEdge", "(IIF)I",
2909a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba        (void*) nativeGetBlockLeftEdge },
2910f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    { "nativeScrollableLayer", "(IILandroid/graphics/Rect;Landroid/graphics/Rect;)I",
2911a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        (void*) nativeScrollableLayer },
2912a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    { "nativeScrollLayer", "(III)Z",
2913a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        (void*) nativeScrollLayer },
2914f51a51f6ea307f4311a04aa865a42b233269540bChris Craik    { "nativeSetIsScrolling", "(Z)V",
2915f51a51f6ea307f4311a04aa865a42b233269540bChris Craik        (void*) nativeSetIsScrolling },
2916c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger    { "nativeUseHardwareAccelSkia", "(Z)V",
2917c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger        (void*) nativeUseHardwareAccelSkia },
29185e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck    { "nativeGetBackgroundColor", "()I",
29195e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck        (void*) nativeGetBackgroundColor },
2920f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard    { "nativeSetProperty", "(Ljava/lang/String;Ljava/lang/String;)Z",
2921d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck        (void*) nativeSetProperty },
2922d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck    { "nativeGetProperty", "(Ljava/lang/String;)Ljava/lang/String;",
2923d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck        (void*) nativeGetProperty },
292452f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck    { "nativeOnTrimMemory", "(I)V",
292552f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck        (void*) nativeOnTrimMemory },
2926d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck    { "nativeSetPauseDrawing", "(IZ)V",
2927d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck        (void*) nativeSetPauseDrawing },
29288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
29298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2930b92850e0391d674b9c4826b66105aaa3dd3eef96Steve Blockint registerWebView(JNIEnv* env)
29318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
29328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jclass clazz = env->FindClass("android/webkit/WebView");
29338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(clazz, "Unable to find class android/webkit/WebView");
29348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    gWebViewField = env->GetFieldID(clazz, "mNativeClass", "I");
29358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG_ASSERT(gWebViewField, "Unable to find android/webkit/WebView.mNativeClass");
2936bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(clazz);
29378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return jniRegisterNativeMethods(env, "android/webkit/WebView", gJavaWebViewMethods, NELEM(gJavaWebViewMethods));
29398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
29408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace android
2942