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