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