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