WebView.cpp revision c6151a04881a67d08d91237891fbc7cb82927219
18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright 2007, The Android Open Source Project 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * * Redistributions of source code must retain the above copyright 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * * Redistributions in binary form must reproduce the above copyright 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 163298a7d84b96ade73c6b170671711a8f2792ae59Steve Block * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define LOG_TAG "webviewglue" 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2820ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "config.h" 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#include "AndroidAnimation.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "AndroidLog.h" 326d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba#include "BaseLayerAndroid.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedFrame.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedNode.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedRoot.h" 3687962ce00229855c098ba12cee8d5c015a835289Cary Clark#include "DrawExtra.h" 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FindCanvas.h" 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h" 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsJNI.h" 40dcbb033aafed2abc472f0d88520869a6b1f1945bLeon Scroggins#include "HTMLInputElement.h" 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IntPoint.h" 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IntRect.h" 43797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#include "LayerAndroid.h" 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Node.h" 45908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase#include "utils/Functor.h" 46d1f5cf1ad8b20860bd9cb34a483451019124d1f9Romain Guy#include "private/hwui/DrawGlInfo.h" 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformGraphicsContext.h" 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h" 49fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott#include "ScrollableLayerAndroid.h" 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SelectText.h" 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkCanvas.h" 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkDumpCanvas.h" 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkPicture.h" 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkRect.h" 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkTime.h" 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_INSTRUMENT 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TimeCounter.h" 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 59a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "TilesManager.h" 6020ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "WebCoreJni.h" 610b84ecf50c01e0fbf7307ca7cae55ab3043c75a3Elliott Slaughter#include "WebRequestContext.h" 6220ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "WebViewCore.h" 6320ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "android_graphics.h" 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef GET_NATIVE_VIEW 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#undef GET_NATIVE_VIEW 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define GET_NATIVE_VIEW(env, obj) ((WebView*)env->GetIntField(obj, gWebViewField)) 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7120ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include <JNIUtility.h> 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <JNIHelp.h> 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <jni.h> 7420ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include <ui/KeycodeLabels.h> 75dd7ee22af4f03672fa823324323466054f19a054Iain Merrick#include <wtf/text/AtomicString.h> 7679768700a853c40c66ff0b0591957958667fdd9eSteve Block#include <wtf/text/CString.h> 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7852f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck// Free as much as we possible can 7952f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck#define TRIM_MEMORY_COMPLETE 80 8052f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck// Free a lot (all textures gone) 8152f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck#define TRIM_MEMORY_MODERATE 60 8252f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck// More moderate free (keep bare minimum to restore quickly-ish - possibly clear all textures) 8352f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck#define TRIM_MEMORY_BACKGROUND 40 8452f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck// Moderate free (clear cached tiles, keep visible ones) 8552f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck#define TRIM_MEMORY_UI_HIDDEN 20 86b31c03a968a578cc43e606ede80cefcd07e8ee07John Reck// Duration to show the pressed cursor ring 87b31c03a968a578cc43e606ede80cefcd07e8ee07John Reck#define PRESSED_STATE_DURATION 400 8852f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace android { 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jfieldID gWebViewField; 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//------------------------------------- 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jmethodID GetJMethod(JNIEnv* env, jclass clazz, const char name[], const char signature[]) 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m = env->GetMethodID(clazz, name, signature); 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(m, "Could not find method %s", name); 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m; 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//------------------------------------- 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This class provides JNI for making calls into native code from the UI side 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// of the multi-threaded WebView. 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass WebView 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic: 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectenum FrameCachePermission { 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DontAllowNewer, 110f92d7cf56380e421b81212d32a557bda707a9555Steve Block AllowNewer 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11387962ce00229855c098ba12cee8d5c015a835289Cary Clarkenum DrawExtras { // keep this in sync with WebView.java 11487962ce00229855c098ba12cee8d5c015a835289Cary Clark DrawExtrasNone = 0, 11587962ce00229855c098ba12cee8d5c015a835289Cary Clark DrawExtrasFind = 1, 11687962ce00229855c098ba12cee8d5c015a835289Cary Clark DrawExtrasSelection = 2, 11787962ce00229855c098ba12cee8d5c015a835289Cary Clark DrawExtrasCursorRing = 3 11887962ce00229855c098ba12cee8d5c015a835289Cary Clark}; 11987962ce00229855c098ba12cee8d5c015a835289Cary Clark 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct JavaGlue { 1213bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott jweak m_obj; 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_overrideLoading; 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_scrollBy; 124bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins jmethodID m_sendMoveFocus; 12546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark jmethodID m_sendMoveMouse; 12646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark jmethodID m_sendMoveMouseIfLatest; 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_sendMotionUp; 12895fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins jmethodID m_domChangedFocus; 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_getScaledMaxXScroll; 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_getScaledMaxYScroll; 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_getVisibleRect; 13294d36f098e1c65d69568e6fb00124c542e5c7f6fLeon Scroggins jmethodID m_rebuildWebTextView; 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_viewInvalidate; 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_viewInvalidateRect; 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_postInvalidateDelayed; 13696eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik jmethodID m_pageSwapCallback; 1373deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger jmethodID m_inFullScreenMode; 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jfieldID m_rectLeft; 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jfieldID m_rectTop; 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_rectWidth; 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_rectHeight; 142ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard jfieldID m_rectFLeft; 143ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard jfieldID m_rectFTop; 144ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard jmethodID m_rectFWidth; 145ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard jmethodID m_rectFHeight; 14662740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck jmethodID m_getTextHandleScale; 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project AutoJObject object(JNIEnv* env) { 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return getRealObject(env, m_obj); 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} m_javaGlue; 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15255b4bdbd661ac94fd05ab40de08250bf242d5346John ReckWebView(JNIEnv* env, jobject javaWebView, int viewImpl, WTF::String drawableDir, 15355b4bdbd661ac94fd05ab40de08250bf242d5346John Reck bool isHighEndGfx) : 15487962ce00229855c098ba12cee8d5c015a835289Cary Clark m_ring((WebViewCore*) viewImpl) 15555b4bdbd661ac94fd05ab40de08250bf242d5346John Reck , m_isHighEndGfx(isHighEndGfx) 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jclass clazz = env->FindClass("android/webkit/WebView"); 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // m_javaGlue = new JavaGlue; 1593bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott m_javaGlue.m_obj = env->NewWeakGlobalRef(javaWebView); 16051c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins m_javaGlue.m_scrollBy = GetJMethod(env, clazz, "setContentScrollBy", "(IIZ)Z"); 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_javaGlue.m_overrideLoading = GetJMethod(env, clazz, "overrideLoading", "(Ljava/lang/String;)V"); 162bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins m_javaGlue.m_sendMoveFocus = GetJMethod(env, clazz, "sendMoveFocus", "(II)V"); 16346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark m_javaGlue.m_sendMoveMouse = GetJMethod(env, clazz, "sendMoveMouse", "(IIII)V"); 16494f12574c74b11db011b994e462f64a112952a47Leon Scroggins m_javaGlue.m_sendMoveMouseIfLatest = GetJMethod(env, clazz, "sendMoveMouseIfLatest", "(ZZ)V"); 165ee260612d8744993644f2e0b0f1fed51423be6dbLeon Scroggins m_javaGlue.m_sendMotionUp = GetJMethod(env, clazz, "sendMotionUp", "(IIIII)V"); 16695fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins m_javaGlue.m_domChangedFocus = GetJMethod(env, clazz, "domChangedFocus", "()V"); 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_javaGlue.m_getScaledMaxXScroll = GetJMethod(env, clazz, "getScaledMaxXScroll", "()I"); 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_javaGlue.m_getScaledMaxYScroll = GetJMethod(env, clazz, "getScaledMaxYScroll", "()I"); 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_javaGlue.m_getVisibleRect = GetJMethod(env, clazz, "sendOurVisibleRect", "()Landroid/graphics/Rect;"); 17094d36f098e1c65d69568e6fb00124c542e5c7f6fLeon Scroggins m_javaGlue.m_rebuildWebTextView = GetJMethod(env, clazz, "rebuildWebTextView", "()V"); 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_javaGlue.m_viewInvalidate = GetJMethod(env, clazz, "viewInvalidate", "()V"); 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_javaGlue.m_viewInvalidateRect = GetJMethod(env, clazz, "viewInvalidate", "(IIII)V"); 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_javaGlue.m_postInvalidateDelayed = GetJMethod(env, clazz, 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project "viewInvalidateDelayed", "(JIIII)V"); 175aeca53d3fee2e94ce013c1dc12648f0335284fbbChris Craik m_javaGlue.m_pageSwapCallback = GetJMethod(env, clazz, "pageSwapCallback", "(Z)V"); 1763deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger m_javaGlue.m_inFullScreenMode = GetJMethod(env, clazz, "inFullScreenMode", "()Z"); 17762740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck m_javaGlue.m_getTextHandleScale = GetJMethod(env, clazz, "getTextHandleScale", "()F"); 178bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block env->DeleteLocalRef(clazz); 179bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jclass rectClass = env->FindClass("android/graphics/Rect"); 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(rectClass, "Could not find Rect class"); 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_javaGlue.m_rectLeft = env->GetFieldID(rectClass, "left", "I"); 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_javaGlue.m_rectTop = env->GetFieldID(rectClass, "top", "I"); 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_javaGlue.m_rectWidth = GetJMethod(env, rectClass, "width", "()I"); 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_javaGlue.m_rectHeight = GetJMethod(env, rectClass, "height", "()I"); 186bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block env->DeleteLocalRef(rectClass); 187bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block 188ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard jclass rectClassF = env->FindClass("android/graphics/RectF"); 189ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard LOG_ASSERT(rectClassF, "Could not find RectF class"); 190ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard m_javaGlue.m_rectFLeft = env->GetFieldID(rectClassF, "left", "F"); 191ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard m_javaGlue.m_rectFTop = env->GetFieldID(rectClassF, "top", "F"); 192ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard m_javaGlue.m_rectFWidth = GetJMethod(env, rectClassF, "width", "()F"); 193ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard m_javaGlue.m_rectFHeight = GetJMethod(env, rectClassF, "height", "()F"); 194bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block env->DeleteLocalRef(rectClassF); 195bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project env->SetIntField(javaWebView, gWebViewField, (jint)this); 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_viewImpl = (WebViewCore*) viewImpl; 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frameCacheUI = 0; 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_navPictureUI = 0; 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_generation = 0; 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_heightCanMeasure = false; 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_lastDx = 0; 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_lastDxTime = 0; 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_ringAnimationEnd = 0; 2056d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba m_baseLayer = 0; 206908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase m_glDrawFunctor = 0; 207d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck m_isDrawingPaused = false; 208ce03c1c1203621e552d41a8b3831837636f364a9Ben Murdoch m_buttonSkin = drawableDir.isEmpty() ? 0 : new RenderSkinButton(drawableDir); 209c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger#if USE(ACCELERATED_COMPOSITING) 210c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger m_glWebViewState = 0; 21196eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik m_pageSwapCallbackRegistered = false; 212c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger#endif 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project~WebView() 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_javaGlue.m_obj) 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 2203bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott env->DeleteWeakGlobalRef(m_javaGlue.m_obj); 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_javaGlue.m_obj = 0; 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 22375394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roard#if USE(ACCELERATED_COMPOSITING) 224c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger // We must remove the m_glWebViewState prior to deleting m_baseLayer. If we 225c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger // do not remove it here, we risk having BaseTiles trying to paint using a 226c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger // deallocated base layer. 2278360bc9c9facd690e42379610cbbb368d3d705efCary Clark stopGL(); 22875394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roard#endif 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete m_frameCacheUI; 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete m_navPictureUI; 231b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger SkSafeUnref(m_baseLayer); 232908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase delete m_glDrawFunctor; 2334de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins delete m_buttonSkin; 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2368360bc9c9facd690e42379610cbbb368d3d705efCary Clarkvoid stopGL() 2378360bc9c9facd690e42379610cbbb368d3d705efCary Clark{ 2388360bc9c9facd690e42379610cbbb368d3d705efCary Clark#if USE(ACCELERATED_COMPOSITING) 2398360bc9c9facd690e42379610cbbb368d3d705efCary Clark delete m_glWebViewState; 2408360bc9c9facd690e42379610cbbb368d3d705efCary Clark m_glWebViewState = 0; 2418360bc9c9facd690e42379610cbbb368d3d705efCary Clark#endif 2428360bc9c9facd690e42379610cbbb368d3d705efCary Clark} 2438360bc9c9facd690e42379610cbbb368d3d705efCary Clark 244bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike ReedWebViewCore* getWebViewCore() const { 245bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed return m_viewImpl; 246bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed} 247bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed 24862740ff35119cc54e82b6af582a01dd34b9e027eJohn Reckfloat getTextHandleScale() 24962740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck{ 25062740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!"); 25162740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck JNIEnv* env = JSC::Bindings::getJNIEnv(); 25262740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck AutoJObject javaObject = m_javaGlue.object(env); 25362740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck if (!javaObject.get()) 25462740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck return 0; 25562740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck float result = env->CallFloatMethod(javaObject.get(), m_javaGlue.m_getTextHandleScale); 25662740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck checkException(env); 25762740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck return result; 25862740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck} 25962740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck 26062740ff35119cc54e82b6af582a01dd34b9e027eJohn Reckvoid updateSelectionHandles() 26162740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck{ 26262740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck if (!m_baseLayer) 26362740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck return; 26462740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck // Adjust for device density & scale 26562740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck m_selectText.updateHandleScale(getTextHandleScale()); 26662740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck} 26762740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck 268c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark// removes the cursor altogether (e.g., when going to a new page) 269c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clarkvoid clearCursor() 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedRoot* root = getFrameCache(AllowNewer); 272c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark if (!root) 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 274c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark DBG_NAV_LOG(""); 27569bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins m_viewImpl->m_hasCursorBounds = false; 276c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark root->clearCursor(); 277c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark viewInvalidate(); 278c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark} 279c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark 280c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark// leaves the cursor where it is, but suppresses drawing it 281c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clarkvoid hideCursor() 282c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark{ 283c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark CachedRoot* root = getFrameCache(AllowNewer); 284c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark if (!root) 285c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark return; 286c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark DBG_NAV_LOG(""); 2870924a66d1664f53afd148456e5709c471ff7240aCary Clark hideCursor(root); 288b31c03a968a578cc43e606ede80cefcd07e8ee07John Reck viewInvalidate(); 2890924a66d1664f53afd148456e5709c471ff7240aCary Clark} 2900924a66d1664f53afd148456e5709c471ff7240aCary Clark 2910924a66d1664f53afd148456e5709c471ff7240aCary Clarkvoid hideCursor(CachedRoot* root) 2920924a66d1664f53afd148456e5709c471ff7240aCary Clark{ 2930924a66d1664f53afd148456e5709c471ff7240aCary Clark DBG_NAV_LOG("inner"); 29469bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins m_viewImpl->m_hasCursorBounds = false; 295c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark root->hideCursor(); 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if DUMP_NAV_CACHE 2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid debugDump() 3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedRoot* root = getFrameCache(DontAllowNewer); 3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (root) 3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project root->mDebug.print(); 3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 307c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Blockvoid scrollToCurrentMatch() 308c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block{ 309c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block if (!m_findOnPage.currentMatchIsInLayer()) { 310c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block scrollRectOnScreen(m_findOnPage.currentMatchBounds()); 311c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block return; 312c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block } 313c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block 314c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block SkRect matchBounds = m_findOnPage.currentMatchBounds(); 3158782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block LayerAndroid* rootLayer = getFrameCache(DontAllowNewer)->rootLayer(); 3168782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block Layer* layerContainingMatch = rootLayer->findById(m_findOnPage.currentMatchLayerId()); 317c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block ASSERT(layerContainingMatch); 318c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block 3198782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // If the match is in a fixed position layer, there's nothing to do. 3208782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block if (layerContainingMatch->shouldInheritFromRootTransform()) 3218782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block return; 3228782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block 3238782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // If the match is in a scrollable layer or a descendant of such a layer, 3248782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // there may be a range of of scroll configurations that will make the 3258782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // current match visible. Our approach is the simplest possible. Starting at 3268782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // the layer in which the match is found, we move up the layer tree, 3278782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // scrolling any scrollable layers as little as possible to make sure that 3288782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // the current match is in view. This approach has the disadvantage that we 3298782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // may end up scrolling a larger number of elements than is necessary, which 3308782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // may be visually jarring. However, minimising the number of layers 3318782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // scrolled would complicate the code significantly. 3328782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block 3338782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block bool didScrollLayer = false; 3348782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block for (Layer* layer = layerContainingMatch; layer; layer = layer->getParent()) { 3358782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block ASSERT(layer->getParent() || layer == rootLayer); 3368782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block 3378782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block if (layer->contentIsScrollable()) { 3388782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // Convert the match location to layer's local space and scroll it. 3398782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // Repeatedly calling Layer::localToAncestor() is inefficient as 3408782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // each call repeats part of the calculation. It would be more 3418782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // efficient to maintain the transform here and update it on each 3428782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // iteration, but that would mean duplicating logic from 3438782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // Layer::localToAncestor() and would complicate things. 3448782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block SkMatrix transform; 3458782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block layerContainingMatch->localToAncestor(layer, &transform); 3468782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block SkRect transformedMatchBounds; 3478782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block transform.mapRect(&transformedMatchBounds, matchBounds); 3488782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block SkIRect roundedTransformedMatchBounds; 3498782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block transformedMatchBounds.roundOut(&roundedTransformedMatchBounds); 3508782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // Only ScrollableLayerAndroid returns true for contentIsScrollable(). 3518782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block didScrollLayer |= static_cast<ScrollableLayerAndroid*>(layer)->scrollRectIntoView(roundedTransformedMatchBounds); 3528782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block } 3538782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block } 3548782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // Invalidate, as the call below to scroll the main page may be a no-op. 3558782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block if (didScrollLayer) 3568782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block viewInvalidate(); 357c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block 358c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block // Convert matchBounds to the global space so we can scroll the main page. 359c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block SkMatrix transform; 360c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block layerContainingMatch->localToGlobal(&transform); 361c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block SkRect transformedMatchBounds; 362c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block transform.mapRect(&transformedMatchBounds, matchBounds); 363c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block SkIRect roundedTransformedMatchBounds; 364c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block transformedMatchBounds.roundOut(&roundedTransformedMatchBounds); 365c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block scrollRectOnScreen(roundedTransformedMatchBounds); 366c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block} 367c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block 368afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clarkvoid scrollRectOnScreen(const IntRect& rect) 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 370afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark if (rect.isEmpty()) 371afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark return; 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int dx = 0; 373afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark int left = rect.x(); 3741ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block int right = rect.maxX(); 375a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount if (left < m_visibleRect.fLeft) 376a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount dx = left - m_visibleRect.fLeft; 3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Only scroll right if the entire width can fit on screen. 378a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount else if (right > m_visibleRect.fRight 379a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount && right - left < m_visibleRect.width()) 380a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount dx = right - m_visibleRect.fRight; 3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int dy = 0; 382afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark int top = rect.y(); 3831ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block int bottom = rect.maxY(); 384a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount if (top < m_visibleRect.fTop) 385a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount dy = top - m_visibleRect.fTop; 3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Only scroll down if the entire height can fit on screen 387a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount else if (bottom > m_visibleRect.fBottom 388a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount && bottom - top < m_visibleRect.height()) 389a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount dy = bottom - m_visibleRect.fBottom; 39051c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins if ((dx|dy) == 0 || !scrollBy(dx, dy)) 391afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark return; 39251c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins viewInvalidate(); 393e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins} 394e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins 395b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clarkvoid resetCursorRing() 396b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark{ 39732dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark m_ringAnimationEnd = 0; 398b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark m_viewImpl->m_hasCursorBounds = false; 399b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark} 400b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark 40187962ce00229855c098ba12cee8d5c015a835289Cary Clarkbool drawCursorPreamble(CachedRoot* root) 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 403dfadaafc15c16563aba837f05c778eaa2a433a8bJohn Reck if (!root) return false; 404461c3fcad8dc54fa3240dcc0cb8989e690408578Cary Clark const CachedFrame* frame; 405461c3fcad8dc54fa3240dcc0cb8989e690408578Cary Clark const CachedNode* node = root->currentCursor(&frame); 4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!node) { 40749e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark DBG_NAV_LOGV("%s", "!node"); 408b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark resetCursorRing(); 40987962ce00229855c098ba12cee8d5c015a835289Cary Clark return false; 4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 411cd8a18fcca4aaa5658aaf236b034516fccac7932Cary Clark m_ring.setIsButton(node); 4123efa919a7f16fdb717e393f501c50d4844ffaed5Cary Clark if (node->isHidden()) { 4133efa919a7f16fdb717e393f501c50d4844ffaed5Cary Clark DBG_NAV_LOG("node->isHidden()"); 41446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark m_viewImpl->m_hasCursorBounds = false; 41587962ce00229855c098ba12cee8d5c015a835289Cary Clark return false; 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 417d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark#if USE(ACCELERATED_COMPOSITING) 418ea684c4f21a0b23ce2ca839f4e9f978d2d02de25Teng-Hui Zhu if (node->isInLayer() && root->rootLayer()) { 4198782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block LayerAndroid* layer = root->rootLayer(); 420a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount layer->updateFixedLayersPositions(m_visibleRect); 421d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark layer->updatePositions(); 422d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark } 423d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark#endif 424f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark setVisibleRect(root); 42587962ce00229855c098ba12cee8d5c015a835289Cary Clark m_ring.m_root = root; 42687962ce00229855c098ba12cee8d5c015a835289Cary Clark m_ring.m_frame = frame; 42787962ce00229855c098ba12cee8d5c015a835289Cary Clark m_ring.m_node = node; 42832dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark SkMSec time = SkTime::GetMSecs(); 42932dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark m_ring.m_isPressed = time < m_ringAnimationEnd 43032dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark && m_ringAnimationEnd != UINT_MAX; 43187962ce00229855c098ba12cee8d5c015a835289Cary Clark return true; 43287962ce00229855c098ba12cee8d5c015a835289Cary Clark} 43387962ce00229855c098ba12cee8d5c015a835289Cary Clark 43487962ce00229855c098ba12cee8d5c015a835289Cary Clarkvoid drawCursorPostamble() 43587962ce00229855c098ba12cee8d5c015a835289Cary Clark{ 43632dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark if (m_ringAnimationEnd == UINT_MAX) 4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 43887962ce00229855c098ba12cee8d5c015a835289Cary Clark SkMSec time = SkTime::GetMSecs(); 43987962ce00229855c098ba12cee8d5c015a835289Cary Clark if (time < m_ringAnimationEnd) { 44087962ce00229855c098ba12cee8d5c015a835289Cary Clark // views assume that inval bounds coordinates are non-negative 44187962ce00229855c098ba12cee8d5c015a835289Cary Clark WebCore::IntRect invalBounds(0, 0, INT_MAX, INT_MAX); 442ef1adcdfc805d4d13103f6f15cc5b4d96828a60fPatrick Scott invalBounds.intersect(m_ring.m_absBounds); 44387962ce00229855c098ba12cee8d5c015a835289Cary Clark postInvalidateDelayed(m_ringAnimationEnd - time, invalBounds); 44487962ce00229855c098ba12cee8d5c015a835289Cary Clark } else { 4450924a66d1664f53afd148456e5709c471ff7240aCary Clark hideCursor(const_cast<CachedRoot*>(m_ring.m_root)); 4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 44787962ce00229855c098ba12cee8d5c015a835289Cary Clark} 448846dd02baeb22227f22c9fda72e48f6810568c14Leon Scroggins 449a5e649bc4d58bf3da959deae077307c487e2a3a6George Mountbool drawGL(WebCore::IntRect& viewRect, WebCore::IntRect* invalRect, 450a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount WebCore::IntRect& webViewRect, int titleBarHeight, 451a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount WebCore::IntRect& clip, float scale, int extras) 452a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 453a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING) 4543deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger if (!m_baseLayer || inFullScreenMode()) 455a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard return false; 456a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 457e47399f767707497dfc68fc64b14621a8ca9959fTeng-Hui Zhu if (!m_glWebViewState) { 45882ccbd8ce95211b4b5afad6a653462fd3beb771bJohn Reck m_glWebViewState = new GLWebViewState(); 45955b4bdbd661ac94fd05ab40de08250bf242d5346John Reck m_glWebViewState->setHighEndGfx(m_isHighEndGfx); 460fcb01cd64de0a1d6f8f8c897d16cc2628be53960John Reck m_glWebViewState->glExtras()->setCursorRingExtra(&m_ring); 461fcb01cd64de0a1d6f8f8c897d16cc2628be53960John Reck m_glWebViewState->glExtras()->setFindOnPageExtra(&m_findOnPage); 462e47399f767707497dfc68fc64b14621a8ca9959fTeng-Hui Zhu if (m_baseLayer->content()) { 46367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard SkRegion region; 46467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard SkIRect rect; 46567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard rect.set(0, 0, m_baseLayer->content()->width(), m_baseLayer->content()->height()); 46667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard region.setRect(rect); 467dfadaafc15c16563aba837f05c778eaa2a433a8bJohn Reck m_glWebViewState->setBaseLayer(m_baseLayer, region, false, true); 468e47399f767707497dfc68fc64b14621a8ca9959fTeng-Hui Zhu } 469e47399f767707497dfc68fc64b14621a8ca9959fTeng-Hui Zhu } 470c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger 471a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard CachedRoot* root = getFrameCache(AllowNewer); 472a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard if (!root) { 473a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard DBG_NAV_LOG("!root"); 474a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard if (extras == DrawExtrasCursorRing) 475a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard resetCursorRing(); 476a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard } 477a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard DrawExtra* extra = 0; 478a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard switch (extras) { 479a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard case DrawExtrasFind: 480a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard extra = &m_findOnPage; 481a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard break; 482a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard case DrawExtrasSelection: 48362740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck // This will involve a JNI call, but under normal circumstances we will 48462740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck // not hit this anyway. Only if USE_JAVA_TEXT_SELECTION is disabled 48562740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck // in WebView.java will we hit this (so really debug only) 48662740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck updateSelectionHandles(); 487a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard extra = &m_selectText; 488a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard break; 489a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard case DrawExtrasCursorRing: 490a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard if (drawCursorPreamble(root) && m_ring.setup()) { 491b31c03a968a578cc43e606ede80cefcd07e8ee07John Reck if (m_ring.m_isPressed || m_ringAnimationEnd == UINT_MAX) 492a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard extra = &m_ring; 493a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard drawCursorPostamble(); 494a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard } 495a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard break; 496a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard default: 497a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard ; 498a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard } 499a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 500c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger unsigned int pic = m_glWebViewState->currentPictureCounter(); 501fcb01cd64de0a1d6f8f8c897d16cc2628be53960John Reck m_glWebViewState->glExtras()->setDrawExtra(extra); 5020ca8045217bb9b308ddb407d7a9ce17d92d9f9fbNicolas Roard 503d68563709fdf68c90c730155149f6149b084730aJohn Reck // Make sure we have valid coordinates. We might not have valid coords 504d68563709fdf68c90c730155149f6149b084730aJohn Reck // if the zoom manager is still initializing. We will be redrawn 505d68563709fdf68c90c730155149f6149b084730aJohn Reck // once the correct scale is set 506a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount if (!m_visibleRect.hasValidCoordinates()) 507d68563709fdf68c90c730155149f6149b084730aJohn Reck return false; 508aeca53d3fee2e94ce013c1dc12648f0335284fbbChris Craik bool treesSwapped = false; 509aeca53d3fee2e94ce013c1dc12648f0335284fbbChris Craik bool newTreeHasAnim = false; 510a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount bool ret = m_glWebViewState->drawGL(viewRect, m_visibleRect, invalRect, 51196eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik webViewRect, titleBarHeight, clip, scale, 512aeca53d3fee2e94ce013c1dc12648f0335284fbbChris Craik &treesSwapped, &newTreeHasAnim); 513aeca53d3fee2e94ce013c1dc12648f0335284fbbChris Craik if (treesSwapped && (m_pageSwapCallbackRegistered || newTreeHasAnim)) { 51496eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik m_pageSwapCallbackRegistered = false; 51596eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!"); 51696eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik JNIEnv* env = JSC::Bindings::getJNIEnv(); 51796eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik AutoJObject javaObject = m_javaGlue.object(env); 51896eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik if (javaObject.get()) { 519aeca53d3fee2e94ce013c1dc12648f0335284fbbChris Craik env->CallVoidMethod(javaObject.get(), m_javaGlue.m_pageSwapCallback, newTreeHasAnim); 52096eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik checkException(env); 52196eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik } 52296eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik } 523c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger if (ret || m_glWebViewState->currentPictureCounter() != pic) 524d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck return !m_isDrawingPaused; 525a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif 526a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard return false; 527a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 528a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 5296d43b9ceb777071c088fe12ee94af80e34816bcfGrace KlobaPictureSet* draw(SkCanvas* canvas, SkColor bgColor, int extras, bool split) 53087962ce00229855c098ba12cee8d5c015a835289Cary Clark{ 5316d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba PictureSet* ret = 0; 5326d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba if (!m_baseLayer) { 5336d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba canvas->drawColor(bgColor); 5346d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return ret; 5356d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba } 5366d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba 5376d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba // draw the content of the base layer first 5386d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba PictureSet* content = m_baseLayer->content(); 5396d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba int sc = canvas->save(SkCanvas::kClip_SaveFlag); 5406d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba canvas->clipRect(SkRect::MakeLTRB(0, 0, content->width(), 5416d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba content->height()), SkRegion::kDifference_Op); 5426d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba canvas->drawColor(bgColor); 5436d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba canvas->restoreToCount(sc); 5446d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba if (content->draw(canvas)) 5456d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba ret = split ? new PictureSet(*content) : 0; 5466d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba 54787962ce00229855c098ba12cee8d5c015a835289Cary Clark CachedRoot* root = getFrameCache(AllowNewer); 54887962ce00229855c098ba12cee8d5c015a835289Cary Clark if (!root) { 54987962ce00229855c098ba12cee8d5c015a835289Cary Clark DBG_NAV_LOG("!root"); 55087962ce00229855c098ba12cee8d5c015a835289Cary Clark if (extras == DrawExtrasCursorRing) 55187962ce00229855c098ba12cee8d5c015a835289Cary Clark resetCursorRing(); 552846dd02baeb22227f22c9fda72e48f6810568c14Leon Scroggins } 55387962ce00229855c098ba12cee8d5c015a835289Cary Clark LayerAndroid mainPicture(m_navPictureUI); 55487962ce00229855c098ba12cee8d5c015a835289Cary Clark DrawExtra* extra = 0; 55587962ce00229855c098ba12cee8d5c015a835289Cary Clark switch (extras) { 55687962ce00229855c098ba12cee8d5c015a835289Cary Clark case DrawExtrasFind: 55787962ce00229855c098ba12cee8d5c015a835289Cary Clark extra = &m_findOnPage; 55887962ce00229855c098ba12cee8d5c015a835289Cary Clark break; 55987962ce00229855c098ba12cee8d5c015a835289Cary Clark case DrawExtrasSelection: 56062740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck // This will involve a JNI call, but under normal circumstances we will 56162740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck // not hit this anyway. Only if USE_JAVA_TEXT_SELECTION is disabled 56262740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck // in WebView.java will we hit this (so really debug only) 56362740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck updateSelectionHandles(); 56487962ce00229855c098ba12cee8d5c015a835289Cary Clark extra = &m_selectText; 56587962ce00229855c098ba12cee8d5c015a835289Cary Clark break; 56687962ce00229855c098ba12cee8d5c015a835289Cary Clark case DrawExtrasCursorRing: 56787962ce00229855c098ba12cee8d5c015a835289Cary Clark if (drawCursorPreamble(root) && m_ring.setup()) { 56882ccbd8ce95211b4b5afad6a653462fd3beb771bJohn Reck extra = &m_ring; 56987962ce00229855c098ba12cee8d5c015a835289Cary Clark drawCursorPostamble(); 57087962ce00229855c098ba12cee8d5c015a835289Cary Clark } 57187962ce00229855c098ba12cee8d5c015a835289Cary Clark break; 57287962ce00229855c098ba12cee8d5c015a835289Cary Clark default: 57387962ce00229855c098ba12cee8d5c015a835289Cary Clark ; 574846dd02baeb22227f22c9fda72e48f6810568c14Leon Scroggins } 57542051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck#if USE(ACCELERATED_COMPOSITING) 57642051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck LayerAndroid* compositeLayer = compositeRoot(); 57742051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck if (compositeLayer) { 57842051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck // call this to be sure we've adjusted for any scrolling or animations 57942051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck // before we actually draw 580a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount compositeLayer->updateFixedLayersPositions(m_visibleRect); 58142051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck compositeLayer->updatePositions(); 58242051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck // We have to set the canvas' matrix on the base layer 58342051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck // (to have fixed layers work as intended) 58442051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck SkAutoCanvasRestore restore(canvas, true); 58542051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck m_baseLayer->setMatrix(canvas->getTotalMatrix()); 58642051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck canvas->resetMatrix(); 58742051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck m_baseLayer->draw(canvas); 58842051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck } 58942051e3a21322f4843268b4bc09c85b7e9250d6dJohn Reck#endif 590eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark if (extra) { 591eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark IntRect dummy; // inval area, unused for now 592eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark extra->draw(canvas, &mainPicture, &dummy); 593eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark } 5946d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return ret; 5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 59787962ce00229855c098ba12cee8d5c015a835289Cary Clark 59846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkbool cursorIsTextInput(FrameCachePermission allowNewer) 5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 60046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark CachedRoot* root = getFrameCache(allowNewer); 6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!root) { 6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOG("!root"); 6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 60546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark const CachedNode* cursor = root->currentCursor(); 606f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark if (!cursor) { 607f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark DBG_NAV_LOG("!cursor"); 6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 609f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark } 6101d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark DBG_NAV_LOGD("%s", cursor->isTextInput() ? "true" : "false"); 6111d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark return cursor->isTextInput(); 6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 61446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkvoid cursorRingBounds(WebCore::IntRect* bounds) 6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOGD("%s", ""); 6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedRoot* root = getFrameCache(DontAllowNewer); 6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (root) { 619f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedFrame* cachedFrame; 620f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedNode* cachedNode = root->currentCursor(&cachedFrame); 6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (cachedNode) { 622f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark *bounds = cachedNode->cursorRingBounds(cachedFrame); 6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOGD("bounds={%d,%d,%d,%d}", bounds->x(), bounds->y(), 6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bounds->width(), bounds->height()); 6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *bounds = WebCore::IntRect(0, 0, 0, 0); 6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 63136747fa778285f57f2f53c047028be83e9d8776dCary Clarkvoid fixCursor() 63236747fa778285f57f2f53c047028be83e9d8776dCary Clark{ 63336747fa778285f57f2f53c047028be83e9d8776dCary Clark m_viewImpl->gCursorBoundsMutex.lock(); 63436747fa778285f57f2f53c047028be83e9d8776dCary Clark bool hasCursorBounds = m_viewImpl->m_hasCursorBounds; 63536747fa778285f57f2f53c047028be83e9d8776dCary Clark IntRect bounds = m_viewImpl->m_cursorBounds; 63636747fa778285f57f2f53c047028be83e9d8776dCary Clark m_viewImpl->gCursorBoundsMutex.unlock(); 63736747fa778285f57f2f53c047028be83e9d8776dCary Clark if (!hasCursorBounds) 63836747fa778285f57f2f53c047028be83e9d8776dCary Clark return; 63936747fa778285f57f2f53c047028be83e9d8776dCary Clark int x, y; 64036747fa778285f57f2f53c047028be83e9d8776dCary Clark const CachedFrame* frame; 641a34b1107b2542fa334fd4db2d58e2df849e083b0Cary Clark const CachedNode* node = m_frameCacheUI->findAt(bounds, &frame, &x, &y, true); 64236747fa778285f57f2f53c047028be83e9d8776dCary Clark if (!node) 64336747fa778285f57f2f53c047028be83e9d8776dCary Clark return; 64436747fa778285f57f2f53c047028be83e9d8776dCary Clark // require that node have approximately the same bounds (+/- 4) and the same 64536747fa778285f57f2f53c047028be83e9d8776dCary Clark // center (+/- 2) 64636747fa778285f57f2f53c047028be83e9d8776dCary Clark IntPoint oldCenter = IntPoint(bounds.x() + (bounds.width() >> 1), 64736747fa778285f57f2f53c047028be83e9d8776dCary Clark bounds.y() + (bounds.height() >> 1)); 648f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark IntRect newBounds = node->bounds(frame); 64936747fa778285f57f2f53c047028be83e9d8776dCary Clark IntPoint newCenter = IntPoint(newBounds.x() + (newBounds.width() >> 1), 65036747fa778285f57f2f53c047028be83e9d8776dCary Clark newBounds.y() + (newBounds.height() >> 1)); 65136747fa778285f57f2f53c047028be83e9d8776dCary Clark DBG_NAV_LOGD("oldCenter=(%d,%d) newCenter=(%d,%d)" 65236747fa778285f57f2f53c047028be83e9d8776dCary Clark " bounds=(%d,%d,w=%d,h=%d) newBounds=(%d,%d,w=%d,h=%d)", 65336747fa778285f57f2f53c047028be83e9d8776dCary Clark oldCenter.x(), oldCenter.y(), newCenter.x(), newCenter.y(), 65436747fa778285f57f2f53c047028be83e9d8776dCary Clark bounds.x(), bounds.y(), bounds.width(), bounds.height(), 65536747fa778285f57f2f53c047028be83e9d8776dCary Clark newBounds.x(), newBounds.y(), newBounds.width(), newBounds.height()); 65636747fa778285f57f2f53c047028be83e9d8776dCary Clark if (abs(oldCenter.x() - newCenter.x()) > 2) 65736747fa778285f57f2f53c047028be83e9d8776dCary Clark return; 65836747fa778285f57f2f53c047028be83e9d8776dCary Clark if (abs(oldCenter.y() - newCenter.y()) > 2) 65936747fa778285f57f2f53c047028be83e9d8776dCary Clark return; 66036747fa778285f57f2f53c047028be83e9d8776dCary Clark if (abs(bounds.x() - newBounds.x()) > 4) 66136747fa778285f57f2f53c047028be83e9d8776dCary Clark return; 66236747fa778285f57f2f53c047028be83e9d8776dCary Clark if (abs(bounds.y() - newBounds.y()) > 4) 66336747fa778285f57f2f53c047028be83e9d8776dCary Clark return; 6641ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block if (abs(bounds.maxX() - newBounds.maxX()) > 4) 66536747fa778285f57f2f53c047028be83e9d8776dCary Clark return; 6661ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block if (abs(bounds.maxY() - newBounds.maxY()) > 4) 66736747fa778285f57f2f53c047028be83e9d8776dCary Clark return; 66836747fa778285f57f2f53c047028be83e9d8776dCary Clark DBG_NAV_LOGD("node=%p frame=%p x=%d y=%d bounds=(%d,%d,w=%d,h=%d)", 66936747fa778285f57f2f53c047028be83e9d8776dCary Clark node, frame, x, y, bounds.x(), bounds.y(), bounds.width(), 67036747fa778285f57f2f53c047028be83e9d8776dCary Clark bounds.height()); 67136747fa778285f57f2f53c047028be83e9d8776dCary Clark m_frameCacheUI->setCursor(const_cast<CachedFrame*>(frame), 67236747fa778285f57f2f53c047028be83e9d8776dCary Clark const_cast<CachedNode*>(node)); 67336747fa778285f57f2f53c047028be83e9d8776dCary Clark} 67436747fa778285f57f2f53c047028be83e9d8776dCary Clark 6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCachedRoot* getFrameCache(FrameCachePermission allowNewer) 6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 67746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark if (!m_viewImpl->m_updatedFrameCache) { 67849e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark DBG_NAV_LOGV("%s", "!m_viewImpl->m_updatedFrameCache"); 6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_frameCacheUI; 68046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark } 68146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark if (allowNewer == DontAllowNewer && m_viewImpl->m_lastGeneration < m_generation) { 68246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark DBG_NAV_LOGD("allowNewer==DontAllowNewer m_viewImpl->m_lastGeneration=%d" 68346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark " < m_generation=%d", m_viewImpl->m_lastGeneration, m_generation); 6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_frameCacheUI; 68546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark } 6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOGD("%s", "m_viewImpl->m_updatedFrameCache == true"); 687f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedFrame* oldCursorFrame; 688f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedNode* oldCursorNode = m_frameCacheUI ? 689f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark m_frameCacheUI->currentCursor(&oldCursorFrame) : 0; 690f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark#if USE(ACCELERATED_COMPOSITING) 691be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark int layerId = -1; 692be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark if (oldCursorNode && oldCursorNode->isInLayer()) { 693be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark const LayerAndroid* cursorLayer = oldCursorFrame->layer(oldCursorNode) 694be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark ->layer(m_frameCacheUI->rootLayer()); 695be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark if (cursorLayer) 696be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark layerId = cursorLayer->uniqueId(); 697be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark } 698f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark#endif 699f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark // get id from old layer and use to find new layer 7003a752d13620eb15148e87a028d66932c74a27993Cary Clark bool oldFocusIsTextInput = false; 7013a752d13620eb15148e87a028d66932c74a27993Cary Clark void* oldFocusNodePointer = 0; 7023a752d13620eb15148e87a028d66932c74a27993Cary Clark if (m_frameCacheUI) { 7033a752d13620eb15148e87a028d66932c74a27993Cary Clark const CachedNode* oldFocus = m_frameCacheUI->currentFocus(); 7043a752d13620eb15148e87a028d66932c74a27993Cary Clark if (oldFocus) { 7053a752d13620eb15148e87a028d66932c74a27993Cary Clark oldFocusIsTextInput = oldFocus->isTextInput(); 7063a752d13620eb15148e87a028d66932c74a27993Cary Clark oldFocusNodePointer = oldFocus->nodePointer(); 7073a752d13620eb15148e87a028d66932c74a27993Cary Clark } 7083a752d13620eb15148e87a028d66932c74a27993Cary Clark } 7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_viewImpl->gFrameCacheMutex.lock(); 7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete m_frameCacheUI; 711b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger SkSafeUnref(m_navPictureUI); 7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_viewImpl->m_updatedFrameCache = false; 7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frameCacheUI = m_viewImpl->m_frameCacheKit; 7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_navPictureUI = m_viewImpl->m_navPictureKit; 7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_viewImpl->m_frameCacheKit = 0; 7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_viewImpl->m_navPictureKit = 0; 7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_viewImpl->gFrameCacheMutex.unlock(); 718f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark if (m_frameCacheUI) 7196d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba m_frameCacheUI->setRootLayer(compositeRoot()); 720f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark#if USE(ACCELERATED_COMPOSITING) 721f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark if (layerId >= 0) { 722f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark LayerAndroid* layer = const_cast<LayerAndroid*>( 723cdd7f6d80774ba3a374f09f22f7cb6bcfca24fa5Mike Reed m_frameCacheUI->rootLayer()); 724cdd7f6d80774ba3a374f09f22f7cb6bcfca24fa5Mike Reed if (layer) { 725a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount layer->updateFixedLayersPositions(m_visibleRect); 726fa26a8dd531dff44d6cad0700ff32c0bb949392cNicolas Roard layer->updatePositions(); 727cdd7f6d80774ba3a374f09f22f7cb6bcfca24fa5Mike Reed } 728f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark } 729f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark#endif 73036747fa778285f57f2f53c047028be83e9d8776dCary Clark fixCursor(); 7313a752d13620eb15148e87a028d66932c74a27993Cary Clark if (oldFocusIsTextInput) { 73295fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins const CachedNode* newFocus = m_frameCacheUI->currentFocus(); 7333a752d13620eb15148e87a028d66932c74a27993Cary Clark if (newFocus && oldFocusNodePointer != newFocus->nodePointer() 7343a752d13620eb15148e87a028d66932c74a27993Cary Clark && newFocus->isTextInput() 73595fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins && newFocus != m_frameCacheUI->currentCursor()) { 73695fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins // The focus has changed. We may need to update things. 73795fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!"); 73895fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins JNIEnv* env = JSC::Bindings::getJNIEnv(); 739b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 740b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (javaObject.get()) { 741b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block env->CallVoidMethod(javaObject.get(), m_javaGlue.m_domChangedFocus); 742b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block checkException(env); 743b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block } 74495fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins } 74595fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins } 746f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark if (oldCursorNode && (!m_frameCacheUI || !m_frameCacheUI->currentCursor())) 74746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark viewInvalidate(); // redraw in case cursor ring is still visible 7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_frameCacheUI; 7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint getScaledMaxXScroll() 7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!"); 7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 755b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 756b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 757b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return 0; 758b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block int result = env->CallIntMethod(javaObject.get(), m_javaGlue.m_getScaledMaxXScroll); 7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint getScaledMaxYScroll() 7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!"); 7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 767b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 768b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 769b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return 0; 770b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block int result = env->CallIntMethod(javaObject.get(), m_javaGlue.m_getScaledMaxYScroll); 7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 775af03a3d6830584ef606be2d1c64845815dadb146Cary ClarkIntRect getVisibleRect() 7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 777af03a3d6830584ef606be2d1c64845815dadb146Cary Clark IntRect rect; 7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!"); 7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 780b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 781b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 782b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return rect; 783b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block jobject jRect = env->CallObjectMethod(javaObject.get(), m_javaGlue.m_getVisibleRect); 7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 785af03a3d6830584ef606be2d1c64845815dadb146Cary Clark rect.setX(env->GetIntField(jRect, m_javaGlue.m_rectLeft)); 7868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 787af03a3d6830584ef606be2d1c64845815dadb146Cary Clark rect.setY(env->GetIntField(jRect, m_javaGlue.m_rectTop)); 7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 789af03a3d6830584ef606be2d1c64845815dadb146Cary Clark rect.setWidth(env->CallIntMethod(jRect, m_javaGlue.m_rectWidth)); 7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 791af03a3d6830584ef606be2d1c64845815dadb146Cary Clark rect.setHeight(env->CallIntMethod(jRect, m_javaGlue.m_rectHeight)); 7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project env->DeleteLocalRef(jRect); 7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 795af03a3d6830584ef606be2d1c64845815dadb146Cary Clark return rect; 7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 798652e9a017a7c5c772361bf57279fae0c26992329Jeff Brownstatic CachedFrame::Direction KeyToDirection(int32_t keyCode) 7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (keyCode) { 801652e9a017a7c5c772361bf57279fae0c26992329Jeff Brown case AKEYCODE_DPAD_RIGHT: 8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOGD("keyCode=%s", "right"); 8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return CachedFrame::RIGHT; 804652e9a017a7c5c772361bf57279fae0c26992329Jeff Brown case AKEYCODE_DPAD_LEFT: 8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOGD("keyCode=%s", "left"); 8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return CachedFrame::LEFT; 807652e9a017a7c5c772361bf57279fae0c26992329Jeff Brown case AKEYCODE_DPAD_DOWN: 8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOGD("keyCode=%s", "down"); 8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return CachedFrame::DOWN; 810652e9a017a7c5c772361bf57279fae0c26992329Jeff Brown case AKEYCODE_DPAD_UP: 8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOGD("keyCode=%s", "up"); 8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return CachedFrame::UP; 8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project default: 814b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark DBG_NAV_LOGD("bad key %d sent", keyCode); 8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return CachedFrame::UNINITIALIZED; 8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 81945b64f60af3cbfa8c78388e35e9b669a0c284bdcBen MurdochWTF::String imageURI(int x, int y) 8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const CachedRoot* root = getFrameCache(DontAllowNewer); 82245b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch return root ? root->imageURI(x, y) : WTF::String(); 8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 825f4669cac3858848a9247e801b6106aeae6d406e8Cary Clarkbool cursorWantsKeyEvents() 8268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const CachedRoot* root = getFrameCache(DontAllowNewer); 8288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (root) { 829f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark const CachedNode* focus = root->currentCursor(); 83046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark if (focus) 831f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark return focus->wantsKeyEvents(); 8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 83669bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins 83746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark/* returns true if the key had no effect (neither scrolled nor changed cursor) */ 8384ca8bc94f71466d1109bfbb9ef00da3256a0899bCary Clarkbool moveCursor(int keyCode, int count, bool ignoreScroll) 8398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedRoot* root = getFrameCache(AllowNewer); 8418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!root) { 8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOG("!root"); 8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 84646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark m_viewImpl->m_moveGeneration++; 847652e9a017a7c5c772361bf57279fae0c26992329Jeff Brown CachedFrame::Direction direction = KeyToDirection(keyCode); 8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const CachedFrame* cachedFrame, * oldFrame = 0; 84946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark const CachedNode* cursor = root->currentCursor(&oldFrame); 85046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark WebCore::IntPoint cursorLocation = root->cursorLocation(); 85146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark DBG_NAV_LOGD("old cursor %d (nativeNode=%p) cursorLocation={%d, %d}", 85246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark cursor ? cursor->index() : 0, 85346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark cursor ? cursor->nodePointer() : 0, cursorLocation.x(), cursorLocation.y()); 854f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark WebCore::IntRect visibleRect = setVisibleRect(root); 8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int xMax = getScaledMaxXScroll(); 8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int yMax = getScaledMaxYScroll(); 8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project root->setMaxScroll(xMax, yMax); 8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const CachedNode* cachedNode = 0; 8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int dx = 0; 8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int dy = 0; 8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int counter = count; 8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (--counter >= 0) { 8638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebCore::IntPoint scroll = WebCore::IntPoint(0, 0); 86446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark cachedNode = root->moveCursor(direction, &cachedFrame, &scroll); 8658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dx += scroll.x(); 8668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dy += scroll.y(); 8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 86846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark DBG_NAV_LOGD("new cursor %d (nativeNode=%p) cursorLocation={%d, %d}" 86946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark "bounds={%d,%d,w=%d,h=%d}", cachedNode ? cachedNode->index() : 0, 87046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark cachedNode ? cachedNode->nodePointer() : 0, 87146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark root->cursorLocation().x(), root->cursorLocation().y(), 872f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark cachedNode ? cachedNode->bounds(cachedFrame).x() : 0, 873f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark cachedNode ? cachedNode->bounds(cachedFrame).y() : 0, 874f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark cachedNode ? cachedNode->bounds(cachedFrame).width() : 0, 875f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark cachedNode ? cachedNode->bounds(cachedFrame).height() : 0); 8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If !m_heightCanMeasure (such as in the browser), we want to scroll no 8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // matter what 8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!ignoreScroll && (!m_heightCanMeasure || 8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project !cachedNode || 88046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (cursor && cursor->nodePointer() == cachedNode->nodePointer()))) 8818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (count == 1 && dx != 0 && dy == 0 && -m_lastDx == dx && 8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SkTime::GetMSecs() - m_lastDxTime < 1000) 8848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project root->checkForJiggle(&dx); 8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOGD("scrollBy %d,%d", dx, dy); 8868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ((dx | dy)) 8878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project this->scrollBy(dx, dy); 8888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_lastDx = dx; 8898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_lastDxTime = SkTime::GetMSecs(); 8908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool result = false; 8928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (cachedNode) { 89332dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark showCursorUntimed(); 89487962ce00229855c098ba12cee8d5c015a835289Cary Clark m_viewImpl->updateCursorBounds(root, cachedFrame, cachedNode); 89590bd422df8e04c486d29c4041acf1c4cf7c3b155Leon Scroggins root->setCursor(const_cast<CachedFrame*>(cachedFrame), 89690bd422df8e04c486d29c4041acf1c4cf7c3b155Leon Scroggins const_cast<CachedNode*>(cachedNode)); 8974ba38126aa5964cd2e1922f3234c745032b5db59Leon Scroggins const CachedNode* focus = root->currentFocus(); 8980a506c68f4ad915ee62e7bf4f22f58b24d078d56Leon Scroggins bool clearTextEntry = cachedNode != focus && focus 8990a506c68f4ad915ee62e7bf4f22f58b24d078d56Leon Scroggins && cachedNode->nodePointer() != focus->nodePointer() && focus->isTextInput(); 90094f12574c74b11db011b994e462f64a112952a47Leon Scroggins // Stop painting the caret if the old focus was a text input and so is the new cursor. 90194f12574c74b11db011b994e462f64a112952a47Leon Scroggins bool stopPaintingCaret = clearTextEntry && cachedNode->wantsKeyEvents(); 90294f12574c74b11db011b994e462f64a112952a47Leon Scroggins sendMoveMouseIfLatest(clearTextEntry, stopPaintingCaret); 9038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 9048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int docHeight = root->documentHeight(); 9058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int docWidth = root->documentWidth(); 9061ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block if (visibleRect.maxY() + dy > docHeight) 9071ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block dy = docHeight - visibleRect.maxY(); 9088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (visibleRect.y() + dy < 0) 9098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dy = -visibleRect.y(); 9101ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block if (visibleRect.maxX() + dx > docWidth) 9111ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block dx = docWidth - visibleRect.maxX(); 9128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (visibleRect.x() < 0) 9138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dx = -visibleRect.x(); 9148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = direction == CachedFrame::LEFT ? dx >= 0 : 9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project direction == CachedFrame::RIGHT ? dx <= 0 : 9168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project direction == CachedFrame::UP ? dy >= 0 : dy <= 0; 9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 9198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid notifyProgressFinished() 9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 92346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark DBG_NAV_LOGD("cursorIsTextInput=%d", cursorIsTextInput(DontAllowNewer)); 92495fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins rebuildWebTextView(); 9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if DEBUG_NAV_UI 9268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frameCacheUI) { 9278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const CachedNode* focus = m_frameCacheUI->currentFocus(); 9288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOGD("focus %d (nativeNode=%p)", 9298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project focus ? focus->index() : 0, 9308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project focus ? focus->nodePointer() : 0); 9318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 9338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst CachedNode* findAt(CachedRoot* root, const WebCore::IntRect& rect, 9368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const CachedFrame** framePtr, int* rxPtr, int* ryPtr) 9378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *rxPtr = 0; 9398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *ryPtr = 0; 9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *framePtr = 0; 9418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!root) 9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 943f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark setVisibleRect(root); 944f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark return root->findAt(rect, framePtr, rxPtr, ryPtr, true); 945f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark} 946f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark 947f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary ClarkIntRect setVisibleRect(CachedRoot* root) 948f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{ 949af03a3d6830584ef606be2d1c64845815dadb146Cary Clark IntRect visibleRect = getVisibleRect(); 950f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark DBG_NAV_LOGD("getVisibleRect %d,%d,%d,%d", 951f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark visibleRect.x(), visibleRect.y(), visibleRect.width(), visibleRect.height()); 9528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project root->setVisibleRect(visibleRect); 953f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark return visibleRect; 9548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid selectBestAt(const WebCore::IntRect& rect) 9578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const CachedFrame* frame; 9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int rx, ry; 960f1610d01f92cb77827d2de13c0ed38554e4f0790Cary Clark CachedRoot* root = getFrameCache(AllowNewer); 961f81c672a4f5c06621000a6df0984cde689397d94Cary Clark if (!root) 962f81c672a4f5c06621000a6df0984cde689397d94Cary Clark return; 9638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const CachedNode* node = findAt(root, rect, &frame, &rx, &ry); 9648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!node) { 9658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOGD("no nodes found root=%p", root); 966fb934b7878723bd752b558aee4047f9aee19405eTeng-Hui Zhu root->rootHistory()->setMouseBounds(rect); 96769bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins m_viewImpl->m_hasCursorBounds = false; 968b41f6483040a4269f2761648f5fa528ca602df5dCary Clark root->setCursor(0, 0); 96932dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark viewInvalidate(); 97046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark } else { 97146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark DBG_NAV_LOGD("CachedNode:%p (%d)", node, node->index()); 972ef1adcdfc805d4d13103f6f15cc5b4d96828a60fPatrick Scott WebCore::IntRect bounds = node->bounds(frame); 973b0c9a2b4033eca931163e8223d7eaa8889337144Patrick Scott root->rootHistory()->setMouseBounds(bounds); 97487962ce00229855c098ba12cee8d5c015a835289Cary Clark m_viewImpl->updateCursorBounds(root, frame, node); 97532dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark showCursorTimed(); 97646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark root->setCursor(const_cast<CachedFrame*>(frame), 97790bd422df8e04c486d29c4041acf1c4cf7c3b155Leon Scroggins const_cast<CachedNode*>(node)); 9788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 97994f12574c74b11db011b994e462f64a112952a47Leon Scroggins sendMoveMouseIfLatest(false, false); 9808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 982d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkconst CachedNode* m_cacheHitNode; 983d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkconst CachedFrame* m_cacheHitFrame; 984d4924af12855cd19162ba1442a6055664c98ca32Cary Clark 985d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkbool pointInNavCache(int x, int y, int slop) 986d4924af12855cd19162ba1442a6055664c98ca32Cary Clark{ 987d4924af12855cd19162ba1442a6055664c98ca32Cary Clark CachedRoot* root = getFrameCache(AllowNewer); 988d4924af12855cd19162ba1442a6055664c98ca32Cary Clark if (!root) 989d4924af12855cd19162ba1442a6055664c98ca32Cary Clark return false; 990d4924af12855cd19162ba1442a6055664c98ca32Cary Clark IntRect rect = IntRect(x - slop, y - slop, slop * 2, slop * 2); 991d4924af12855cd19162ba1442a6055664c98ca32Cary Clark int rx, ry; 992d4924af12855cd19162ba1442a6055664c98ca32Cary Clark return (m_cacheHitNode = findAt(root, rect, &m_cacheHitFrame, &rx, &ry)); 993d4924af12855cd19162ba1442a6055664c98ca32Cary Clark} 994d4924af12855cd19162ba1442a6055664c98ca32Cary Clark 99546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkbool motionUp(int x, int y, int slop) 9968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool pageScrolled = false; 998d4924af12855cd19162ba1442a6055664c98ca32Cary Clark IntRect rect = IntRect(x - slop, y - slop, slop * 2, slop * 2); 9998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int rx, ry; 10008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedRoot* root = getFrameCache(AllowNewer); 100173d131bc28aa2a68fe686ffd9426814448f5da7bCary Clark if (!root) 1002d4924af12855cd19162ba1442a6055664c98ca32Cary Clark return 0; 1003d4924af12855cd19162ba1442a6055664c98ca32Cary Clark const CachedFrame* frame = 0; 1004af3b7507bd6d2b10fce43aa0728b8afcf5cddd86Cary Clark const CachedNode* result = findAt(root, rect, &frame, &rx, &ry); 1005ec079933211eb47479b2624cb6be72257d178c01Cary Clark CachedHistory* history = root->rootHistory(); 10068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!result) { 10078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOGD("no nodes found root=%p", root); 1008ec079933211eb47479b2624cb6be72257d178c01Cary Clark history->setNavBounds(rect); 100969bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins m_viewImpl->m_hasCursorBounds = false; 101069bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins root->hideCursor(); 101169bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins int dx = root->checkForCenter(x, y); 101269bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins if (dx) { 101369bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins scrollBy(dx, 0); 101469bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins pageScrolled = true; 10158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 101646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark sendMotionUp(frame ? (WebCore::Frame*) frame->framePointer() : 0, 1017ee260612d8744993644f2e0b0f1fed51423be6dbLeon Scroggins 0, x, y); 101846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark viewInvalidate(); 10198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return pageScrolled; 10208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOGD("CachedNode:%p (%d) x=%d y=%d rx=%d ry=%d", result, 10228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result->index(), x, y, rx, ry); 102315f1e443f22288ee82cde972517ebf3cc1153d97Leon Scroggins WebCore::IntRect navBounds = WebCore::IntRect(rx, ry, 1, 1); 1024ec079933211eb47479b2624cb6be72257d178c01Cary Clark history->setNavBounds(navBounds); 1025ec079933211eb47479b2624cb6be72257d178c01Cary Clark history->setMouseBounds(navBounds); 102687962ce00229855c098ba12cee8d5c015a835289Cary Clark m_viewImpl->updateCursorBounds(root, frame, result); 102746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark root->setCursor(const_cast<CachedFrame*>(frame), 10288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const_cast<CachedNode*>(result)); 102932dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark if (result->isSyntheticLink()) 103032dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark overrideUrlLoading(result->getExport()); 103132dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark else { 103246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark sendMotionUp( 103334bca311c8205ee40379adac2ef4da01e401600eCary Clark (WebCore::Frame*) frame->framePointer(), 1034ee260612d8744993644f2e0b0f1fed51423be6dbLeon Scroggins (WebCore::Node*) result->nodePointer(), rx, ry); 103546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark } 103632dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark if (result->isTextInput() || result->isSelect() 103732dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark || result->isContentEditable()) { 103832dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark showCursorUntimed(); 103932dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark } else 104032dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark showCursorTimed(); 10418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return pageScrolled; 10428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 104482f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if USE(ACCELERATED_COMPOSITING) 1045f81c672a4f5c06621000a6df0984cde689397d94Cary Clarkstatic const ScrollableLayerAndroid* findScrollableLayer( 1046f81c672a4f5c06621000a6df0984cde689397d94Cary Clark const LayerAndroid* parent, int x, int y, SkIRect* foundBounds) { 104782f247bdbb98dd80c44209d87692c650c3704617Patrick Scott SkRect bounds; 104882f247bdbb98dd80c44209d87692c650c3704617Patrick Scott parent->bounds(&bounds); 104982f247bdbb98dd80c44209d87692c650c3704617Patrick Scott // Check the parent bounds first; this will clip to within a masking layer's 105082f247bdbb98dd80c44209d87692c650c3704617Patrick Scott // bounds. 1051fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott if (parent->masksToBounds() && !bounds.contains(x, y)) 105282f247bdbb98dd80c44209d87692c650c3704617Patrick Scott return 0; 105382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott // Move the hit test local to parent. 105482f247bdbb98dd80c44209d87692c650c3704617Patrick Scott x -= bounds.fLeft; 105582f247bdbb98dd80c44209d87692c650c3704617Patrick Scott y -= bounds.fTop; 105682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott int count = parent->countChildren(); 10571a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott while (count--) { 10581a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott const LayerAndroid* child = parent->getChild(count); 1059f81c672a4f5c06621000a6df0984cde689397d94Cary Clark const ScrollableLayerAndroid* result = findScrollableLayer(child, x, y, 1060f81c672a4f5c06621000a6df0984cde689397d94Cary Clark foundBounds); 1061f81c672a4f5c06621000a6df0984cde689397d94Cary Clark if (result) { 1062f81c672a4f5c06621000a6df0984cde689397d94Cary Clark foundBounds->offset(bounds.fLeft, bounds.fTop); 1063f81c672a4f5c06621000a6df0984cde689397d94Cary Clark if (parent->masksToBounds()) { 1064f81c672a4f5c06621000a6df0984cde689397d94Cary Clark if (bounds.width() < foundBounds->width()) 1065f81c672a4f5c06621000a6df0984cde689397d94Cary Clark foundBounds->fRight = foundBounds->fLeft + bounds.width(); 1066f81c672a4f5c06621000a6df0984cde689397d94Cary Clark if (bounds.height() < foundBounds->height()) 1067f81c672a4f5c06621000a6df0984cde689397d94Cary Clark foundBounds->fBottom = foundBounds->fTop + bounds.height(); 1068f81c672a4f5c06621000a6df0984cde689397d94Cary Clark } 106982f247bdbb98dd80c44209d87692c650c3704617Patrick Scott return result; 1070f81c672a4f5c06621000a6df0984cde689397d94Cary Clark } 107182f247bdbb98dd80c44209d87692c650c3704617Patrick Scott } 1072f81c672a4f5c06621000a6df0984cde689397d94Cary Clark if (parent->contentIsScrollable()) { 1073f81c672a4f5c06621000a6df0984cde689397d94Cary Clark foundBounds->set(0, 0, bounds.width(), bounds.height()); 1074fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott return static_cast<const ScrollableLayerAndroid*>(parent); 1075f81c672a4f5c06621000a6df0984cde689397d94Cary Clark } 107682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott return 0; 107782f247bdbb98dd80c44209d87692c650c3704617Patrick Scott} 107882f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif 107982f247bdbb98dd80c44209d87692c650c3704617Patrick Scott 1080f81c672a4f5c06621000a6df0984cde689397d94Cary Clarkint scrollableLayer(int x, int y, SkIRect* layerRect, SkIRect* bounds) 1081a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{ 108282f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if USE(ACCELERATED_COMPOSITING) 1083af03a3d6830584ef606be2d1c64845815dadb146Cary Clark const LayerAndroid* layerRoot = compositeRoot(); 1084af03a3d6830584ef606be2d1c64845815dadb146Cary Clark if (!layerRoot) 1085a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott return 0; 1086f81c672a4f5c06621000a6df0984cde689397d94Cary Clark const ScrollableLayerAndroid* result = findScrollableLayer(layerRoot, x, y, 1087f81c672a4f5c06621000a6df0984cde689397d94Cary Clark bounds); 108822e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott if (result) { 108922e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott result->getScrollRect(layerRect); 10908598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott return result->uniqueId(); 109122e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott } 1092a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#endif 1093a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott return 0; 1094a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott} 1095a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott 109670adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craikvoid scrollLayer(int layerId, int x, int y) 109770adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik{ 109870adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik if (m_glWebViewState) 109970adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik m_glWebViewState->scrollLayer(layerId, x, y); 110070adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik} 110170adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik 1102fa768f11d82c34980cce020f442329299efb08caCary Clarkint getBlockLeftEdge(int x, int y, float scale) 1103a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba{ 1104a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba CachedRoot* root = getFrameCache(AllowNewer); 1105a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba if (root) 1106fa768f11d82c34980cce020f442329299efb08caCary Clark return root->getBlockLeftEdge(x, y, scale); 1107a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba return -1; 1108a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba} 1109a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba 111045b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdochvoid overrideUrlLoading(const WTF::String& url) 11118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 1113b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 1114b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 1115b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return; 111679b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block jstring jName = wtfStringToJstring(env, url); 1117b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block env->CallVoidMethod(javaObject.get(), m_javaGlue.m_overrideLoading, jName); 11188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project env->DeleteLocalRef(jName); 11198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid setFindIsUp(bool up) 11228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1123afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark DBG_NAV_LOGD("up=%d", up); 11248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_viewImpl->m_findIsUp = up; 1125afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark} 1126afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark 1127afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clarkvoid setFindIsEmpty() 1128afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark{ 1129afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark DBG_NAV_LOG(""); 1130afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark m_findOnPage.clearCurrentLocation(); 11318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 113332dffb883f56b18019afa7a01b2564b993b3fe8eCary Clarkvoid showCursorTimed() 11348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 113532dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark DBG_NAV_LOG(""); 1136b31c03a968a578cc43e606ede80cefcd07e8ee07John Reck m_ringAnimationEnd = SkTime::GetMSecs() + PRESSED_STATE_DURATION; 113732dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark viewInvalidate(); 113832dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark} 113932dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark 114032dffb883f56b18019afa7a01b2564b993b3fe8eCary Clarkvoid showCursorUntimed() 114132dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark{ 114232dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark DBG_NAV_LOG(""); 11437a69d7c255012f3fcc4d9af040600eac1b2e5c56Cary Clark m_ring.m_isPressed = false; 114432dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark m_ringAnimationEnd = UINT_MAX; 114532dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark viewInvalidate(); 11468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid setHeightCanMeasure(bool measure) 11498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_heightCanMeasure = measure; 11518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 115387962ce00229855c098ba12cee8d5c015a835289Cary ClarkString getSelection() 11548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 115587962ce00229855c098ba12cee8d5c015a835289Cary Clark return m_selectText.getSelection(); 11568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1158a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkvoid moveSelection(int x, int y) 11598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1160af03a3d6830584ef606be2d1c64845815dadb146Cary Clark m_selectText.moveSelection(getVisibleRect(), x, y); 11618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1163515943cc7c9a60faa661739271d5fa14fcba9df8Cary ClarkIntPoint selectableText() 1164515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark{ 1165515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark const CachedRoot* root = getFrameCache(DontAllowNewer); 1166515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark if (!root) 1167515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark return IntPoint(0, 0); 1168515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark return m_selectText.selectableText(root); 1169515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark} 1170515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark 1171a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkvoid selectAll() 1172a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 1173af03a3d6830584ef606be2d1c64845815dadb146Cary Clark m_selectText.selectAll(); 1174a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 1175a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 1176a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkint selectionX() 1177a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 1178a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark return m_selectText.selectionX(); 1179a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 1180a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 1181a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkint selectionY() 1182a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 1183a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark return m_selectText.selectionY(); 1184a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 1185a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 1186a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkvoid resetSelection() 1187a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 1188a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark m_selectText.reset(); 1189a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 1190a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 1191a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkbool startSelection(int x, int y) 1192a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 1193af03a3d6830584ef606be2d1c64845815dadb146Cary Clark const CachedRoot* root = getFrameCache(DontAllowNewer); 1194af03a3d6830584ef606be2d1c64845815dadb146Cary Clark if (!root) 1195af03a3d6830584ef606be2d1c64845815dadb146Cary Clark return false; 119662740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck updateSelectionHandles(); 1197af03a3d6830584ef606be2d1c64845815dadb146Cary Clark return m_selectText.startSelection(root, getVisibleRect(), x, y); 1198a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 1199a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 1200a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkbool wordSelection(int x, int y) 1201a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 12029432ba4878ebf79acd4424398b344c154f452db2Cary Clark const CachedRoot* root = getFrameCache(DontAllowNewer); 12039432ba4878ebf79acd4424398b344c154f452db2Cary Clark if (!root) 1204a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark return false; 120562740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck updateSelectionHandles(); 12069432ba4878ebf79acd4424398b344c154f452db2Cary Clark return m_selectText.wordSelection(root, getVisibleRect(), x, y); 1207a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 1208a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 1209a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkbool extendSelection(int x, int y) 1210a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 1211af03a3d6830584ef606be2d1c64845815dadb146Cary Clark m_selectText.extendSelection(getVisibleRect(), x, y); 1212a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark return true; 1213a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 1214a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 1215a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkbool hitSelection(int x, int y) 1216a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 121762740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck updateSelectionHandles(); 1218a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark return m_selectText.hitSelection(x, y); 1219a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 1220a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 1221a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkvoid setExtendSelection() 1222a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 1223a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark m_selectText.setExtendSelection(true); 1224a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 1225a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 1226a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkvoid setSelectionPointer(bool set, float scale, int x, int y) 12278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 122887962ce00229855c098ba12cee8d5c015a835289Cary Clark m_selectText.setDrawPointer(set); 122987962ce00229855c098ba12cee8d5c015a835289Cary Clark if (!set) 123087962ce00229855c098ba12cee8d5c015a835289Cary Clark return; 123187962ce00229855c098ba12cee8d5c015a835289Cary Clark m_selectText.m_inverseScale = scale; 123287962ce00229855c098ba12cee8d5c015a835289Cary Clark m_selectText.m_selectX = x; 123387962ce00229855c098ba12cee8d5c015a835289Cary Clark m_selectText.m_selectY = y; 12348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1236bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scrogginsvoid sendMoveFocus(WebCore::Frame* framePtr, WebCore::Node* nodePtr) 1237bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins{ 12385e5962825729a211e093fd615ddc9e5b0bec10bdCary Clark DBG_NAV_LOGD("framePtr=%p nodePtr=%p", framePtr, nodePtr); 1239bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins JNIEnv* env = JSC::Bindings::getJNIEnv(); 1240b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 1241b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 1242b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return; 1243b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block env->CallVoidMethod(javaObject.get(), m_javaGlue.m_sendMoveFocus, (jint) framePtr, (jint) nodePtr); 1244bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins checkException(env); 1245bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins} 1246bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins 124746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkvoid sendMoveMouse(WebCore::Frame* framePtr, WebCore::Node* nodePtr, int x, int y) 12488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOGD("framePtr=%p nodePtr=%p x=%d y=%d", framePtr, nodePtr, x, y); 12508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 1251b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 1252b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 1253b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return; 1254b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block env->CallVoidMethod(javaObject.get(), m_javaGlue.m_sendMoveMouse, reinterpret_cast<jint>(framePtr), reinterpret_cast<jint>(nodePtr), x, y); 12558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 12568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 125894f12574c74b11db011b994e462f64a112952a47Leon Scrogginsvoid sendMoveMouseIfLatest(bool clearTextEntry, bool stopPaintingCaret) 12598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!"); 12618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 1262b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 1263b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 1264b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return; 1265b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block env->CallVoidMethod(javaObject.get(), m_javaGlue.m_sendMoveMouseIfLatest, clearTextEntry, stopPaintingCaret); 12668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 12678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1269b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Blockvoid sendMotionUp(WebCore::Frame* framePtr, WebCore::Node* nodePtr, int x, int y) 12708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1271b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block DBG_NAV_LOGD("m_generation=%d framePtr=%p nodePtr=%p x=%d y=%d", m_generation, framePtr, nodePtr, x, y); 12728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(m_javaGlue.m_obj, "A WebView was not associated with this WebViewNative!"); 1273b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block 12748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 1275b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 1276b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 1277b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return; 1278b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block m_viewImpl->m_touchGeneration = ++m_generation; 1279b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block env->CallVoidMethod(javaObject.get(), m_javaGlue.m_sendMotionUp, m_generation, (jint) framePtr, (jint) nodePtr, x, y); 12808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 12818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid findNext(bool forward) 12848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1285f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark m_findOnPage.findNext(forward); 1286c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block scrollToCurrentMatch(); 12878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project viewInvalidate(); 12888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// With this call, WebView takes ownership of matches, and is responsible for 12918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// deleting it. 1292db17cf1782eab2488aab0933add6c79b21639c08Leon Scrogginsvoid setMatches(WTF::Vector<MatchInfo>* matches, jboolean sameAsLastSearch) 1293db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins{ 1294db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins // If this search is the same as the last one, check against the old 1295db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins // location to determine whether to scroll. If the same word is found 1296db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins // in the same place, then do not scroll. 1297db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins IntRect oldLocation; 1298c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block bool checkAgainstOldLocation = false; 1299db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins if (sameAsLastSearch && m_findOnPage.isCurrentLocationValid()) { 1300db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins oldLocation = m_findOnPage.currentMatchBounds(); 1301db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins checkAgainstOldLocation = true; 1302c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block } 1303db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins 1304f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark m_findOnPage.setMatches(matches); 1305db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins 1306c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block if (!checkAgainstOldLocation || oldLocation != m_findOnPage.currentMatchBounds()) 1307c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block scrollToCurrentMatch(); 13088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project viewInvalidate(); 13098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1311afbc0998ef990403a8e17efb9a384a46707a328eLeon Scrogginsint currentMatchIndex() 1312afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins{ 1313afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins return m_findOnPage.currentMatchIndex(); 1314afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins} 1315afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins 131651c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scrogginsbool scrollBy(int dx, int dy) 13178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!"); 13198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 1321b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 1322b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 1323b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return false; 1324b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block bool result = env->CallBooleanMethod(javaObject.get(), m_javaGlue.m_scrollBy, dx, dy, true); 13258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 132651c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins return result; 13278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1329f51a51f6ea307f4311a04aa865a42b233269540bChris Craikvoid setIsScrolling(bool isScrolling) 1330f51a51f6ea307f4311a04aa865a42b233269540bChris Craik{ 1331ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch#if USE(ACCELERATED_COMPOSITING) 1332ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch if (m_glWebViewState) 1333ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch m_glWebViewState->setIsScrolling(isScrolling); 1334ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch#endif 1335f51a51f6ea307f4311a04aa865a42b233269540bChris Craik} 1336f51a51f6ea307f4311a04aa865a42b233269540bChris Craik 133746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkbool hasCursorNode() 13388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedRoot* root = getFrameCache(DontAllowNewer); 13408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!root) { 13418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOG("!root"); 13428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 13438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 134446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark const CachedNode* cursorNode = root->currentCursor(); 134546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark DBG_NAV_LOGD("cursorNode=%d (nodePointer=%p)", 134646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark cursorNode ? cursorNode->index() : -1, 134746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark cursorNode ? cursorNode->nodePointer() : 0); 134846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return cursorNode; 134946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 135046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 135146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkbool hasFocusNode() 135246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 135346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark CachedRoot* root = getFrameCache(DontAllowNewer); 135446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark if (!root) { 135546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark DBG_NAV_LOG("!root"); 13568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 13578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 135846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark const CachedNode* focusNode = root->currentFocus(); 135946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark DBG_NAV_LOGD("focusNode=%d (nodePointer=%p)", 136046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark focusNode ? focusNode->index() : -1, 136146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark focusNode ? focusNode->nodePointer() : 0); 136246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return focusNode; 13638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 136595fa6e99128685c55e9be6f4362e67c288482a74Leon Scrogginsvoid rebuildWebTextView() 13668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 1368b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 1369b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 1370b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return; 1371b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block env->CallVoidMethod(javaObject.get(), m_javaGlue.m_rebuildWebTextView); 13728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 13738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid viewInvalidate() 13768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 1378b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 1379b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 1380b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return; 1381b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block env->CallVoidMethod(javaObject.get(), m_javaGlue.m_viewInvalidate); 13828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 13838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid viewInvalidateRect(int l, int t, int r, int b) 13868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 1388b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 1389b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 1390b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return; 1391b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block env->CallVoidMethod(javaObject.get(), m_javaGlue.m_viewInvalidateRect, l, r, t, b); 13928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 13938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid postInvalidateDelayed(int64_t delay, const WebCore::IntRect& bounds) 13968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 1398b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 1399b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 1400b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return; 1401b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block env->CallVoidMethod(javaObject.get(), m_javaGlue.m_postInvalidateDelayed, 14021ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block delay, bounds.x(), bounds.y(), bounds.maxX(), bounds.maxY()); 14038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 14048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14063deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenbergerbool inFullScreenMode() 14073deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger{ 14083deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger JNIEnv* env = JSC::Bindings::getJNIEnv(); 1409b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 1410b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 1411b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return false; 1412b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block jboolean result = env->CallBooleanMethod(javaObject.get(), m_javaGlue.m_inFullScreenMode); 14133deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger checkException(env); 14143deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger return result; 14153deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger} 14163deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger 141746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkint moveGeneration() 141846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 141946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return m_viewImpl->m_moveGeneration; 142046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 142146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 14226d43b9ceb777071c088fe12ee94af80e34816bcfGrace KlobaLayerAndroid* compositeRoot() const 1423f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{ 14246d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba LOG_ASSERT(!m_baseLayer || m_baseLayer->countChildren() == 1, 14256d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba "base layer can't have more than one child %s", __FUNCTION__); 14266d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba if (m_baseLayer && m_baseLayer->countChildren() == 1) 14276d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return static_cast<LayerAndroid*>(m_baseLayer->getChild(0)); 14286d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba else 14296d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return 0; 1430f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark} 1431f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark 143282f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL) 1433a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scottstatic void copyScrollPositionRecursive(const LayerAndroid* from, 1434a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott LayerAndroid* root) 1435a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{ 1436a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott if (!from || !root) 1437a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott return; 1438a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott for (int i = 0; i < from->countChildren(); i++) { 1439a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott const LayerAndroid* l = from->getChild(i); 1440a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott if (l->contentIsScrollable()) { 144182f247bdbb98dd80c44209d87692c650c3704617Patrick Scott const SkPoint& pos = l->getPosition(); 144282f247bdbb98dd80c44209d87692c650c3704617Patrick Scott LayerAndroid* match = root->findById(l->uniqueId()); 144382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott if (match && match->contentIsScrollable()) 144482f247bdbb98dd80c44209d87692c650c3704617Patrick Scott match->setPosition(pos.fX, pos.fY); 1445a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott } 1446a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott copyScrollPositionRecursive(l, root); 1447a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott } 1448a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott} 144982f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif 1450a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott 1451af33356e96e56310c66b47b6db913e1a61981ca3Chris Craikvoid registerPageSwapCallback() 1452af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik{ 1453af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik m_pageSwapCallbackRegistered = true; 1454af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik} 1455af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik 14566a3bd3f2b6b5a5c80e5fc1674550456b67e2cc7cShimeng (Simon) Wangvoid setBaseLayer(BaseLayerAndroid* layer, SkRegion& inval, bool showVisualIndicator, 145796eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik bool isPictureAfterFirstLayout, bool registerPageSwapCallback) 1458f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{ 1459a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING) 1460c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger if (m_glWebViewState) 14616a3bd3f2b6b5a5c80e5fc1674550456b67e2cc7cShimeng (Simon) Wang m_glWebViewState->setBaseLayer(layer, inval, showVisualIndicator, 14626a3bd3f2b6b5a5c80e5fc1674550456b67e2cc7cShimeng (Simon) Wang isPictureAfterFirstLayout); 146396eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik m_pageSwapCallbackRegistered |= registerPageSwapCallback; 1464a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif 1465a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 146682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL) 1467cf6e10e145f44cab3eb70f3782b51a92cf61ae7dShimeng (Simon) Wang if (layer) { 14687962416088590b8449c81a02f0a882ad29840cbeChris Craik // TODO: the below tree copies are only necessary in software rendering 146982f247bdbb98dd80c44209d87692c650c3704617Patrick Scott LayerAndroid* newCompositeRoot = static_cast<LayerAndroid*>(layer->getChild(0)); 147082f247bdbb98dd80c44209d87692c650c3704617Patrick Scott copyScrollPositionRecursive(compositeRoot(), newCompositeRoot); 1471cf6e10e145f44cab3eb70f3782b51a92cf61ae7dShimeng (Simon) Wang } 147282f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif 1473b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger SkSafeUnref(m_baseLayer); 14746d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba m_baseLayer = layer; 1475f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark CachedRoot* root = getFrameCache(DontAllowNewer); 1476f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark if (!root) 1477f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark return; 1478f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark root->resetLayers(); 14796d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba root->setRootLayer(compositeRoot()); 14806d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba} 14816d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba 14828111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reckvoid getTextSelectionRegion(SkRegion *region) 14838111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck{ 14840bab4025aed8786cb8307d2eede87f7f21cc0d65John Reck m_selectText.getSelectionRegion(getVisibleRect(), region, compositeRoot()); 14858111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck} 14868111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck 1487e94313e95fb5e08870a58c7a4b593da08cc3d424John Reckvoid getTextSelectionHandles(int* handles) 1488e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck{ 1489292448625cf74fa0cbb6776572d5b116d2e7eb15John Reck m_selectText.getSelectionHandles(handles, compositeRoot()); 1490e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck} 1491e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck 14926d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobavoid replaceBaseContent(PictureSet* set) 14936d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{ 14946d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba if (!m_baseLayer) 14956d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return; 14966d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba m_baseLayer->setContent(*set); 14976d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba delete set; 14986d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba} 14996d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba 15006d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobavoid copyBaseContentToPicture(SkPicture* picture) 15016d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{ 15026d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba if (!m_baseLayer) 15036d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return; 15046d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba PictureSet* content = m_baseLayer->content(); 1505e59ed3e2c930c8eeed844aa0365e8285d956a8f2Nicolas Roard m_baseLayer->drawCanvas(picture->beginRecording(content->width(), content->height(), 15066d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba SkPicture::kUsePathBoundsForClip_RecordingFlag)); 15076d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba picture->endRecording(); 15086d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba} 15096d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba 15106d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobabool hasContent() { 15116d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba if (!m_baseLayer) 15126d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return false; 15136d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return !m_baseLayer->content()->isEmpty(); 1514f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark} 1515f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark 1516908703e420f4931f74527aaeb3d5faabdd66c28aChet Haasevoid setFunctor(Functor* functor) { 1517908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase delete m_glDrawFunctor; 1518908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase m_glDrawFunctor = functor; 1519908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase} 1520908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase 1521908703e420f4931f74527aaeb3d5faabdd66c28aChet HaaseFunctor* getFunctor() { 1522908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase return m_glDrawFunctor; 1523908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase} 1524908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase 15254212fae38ffee2bbb657dd19e4ae8b7c735f4953John ReckBaseLayerAndroid* getBaseLayer() { 15264212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck return m_baseLayer; 15274212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck} 15284212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck 1529a5e649bc4d58bf3da959deae077307c487e2a3a6George Mountvoid setVisibleRect(SkRect& visibleRect) { 1530a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount m_visibleRect = visibleRect; 1531a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount} 1532a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount 1533d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck bool m_isDrawingPaused; 15348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate: // local state for WebView 15358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // private to getFrameCache(); other functions operate in a different thread 15368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedRoot* m_frameCacheUI; // navigation data ready for use 15378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebViewCore* m_viewImpl; 15388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int m_generation; // associate unique ID with sent kit focus to match with ui 15398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SkPicture* m_navPictureUI; 15408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SkMSec m_ringAnimationEnd; 15418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Corresponds to the same-named boolean on the java side. 15428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool m_heightCanMeasure; 15438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int m_lastDx; 15448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SkMSec m_lastDxTime; 154587962ce00229855c098ba12cee8d5c015a835289Cary Clark SelectText m_selectText; 1546f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark FindOnPage m_findOnPage; 154787962ce00229855c098ba12cee8d5c015a835289Cary Clark CursorRing m_ring; 15486d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba BaseLayerAndroid* m_baseLayer; 1549908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase Functor* m_glDrawFunctor; 1550a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING) 1551c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger GLWebViewState* m_glWebViewState; 155296eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik bool m_pageSwapCallbackRegistered; 1553a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif 1554ce03c1c1203621e552d41a8b3831837636f364a9Ben Murdoch RenderSkinButton* m_buttonSkin; 1555a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount SkRect m_visibleRect; 155655b4bdbd661ac94fd05ab40de08250bf242d5346John Reck bool m_isHighEndGfx; 15578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; // end of WebView class 15588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1559908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase 1560908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase/** 1561908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * This class holds a function pointer and parameters for calling drawGL into a specific 1562908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * viewport. The pointer to the Functor will be put on a framework display list to be called 1563908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * when the display list is replayed. 1564908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase */ 1565908703e420f4931f74527aaeb3d5faabdd66c28aChet Haaseclass GLDrawFunctor : Functor { 1566908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase public: 1567908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase GLDrawFunctor(WebView* _wvInstance, 1568a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount bool(WebView::*_funcPtr)(WebCore::IntRect&, WebCore::IntRect*, 1569a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount WebCore::IntRect&, int, WebCore::IntRect&, 1570a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount jfloat, jint), 1571908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase WebCore::IntRect _viewRect, float _scale, int _extras) { 1572908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase wvInstance = _wvInstance; 1573908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase funcPtr = _funcPtr; 1574908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase viewRect = _viewRect; 1575908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase scale = _scale; 1576908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase extras = _extras; 1577908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase }; 157879d8e0434bfe00a793e8041f96dc02ec1d98e694Romain Guy status_t operator()(int messageId, void* data) { 157979d8e0434bfe00a793e8041f96dc02ec1d98e694Romain Guy if (viewRect.isEmpty()) { 1580821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase // NOOP operation if viewport is empty 1581821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase return 0; 1582821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase } 158379d8e0434bfe00a793e8041f96dc02ec1d98e694Romain Guy 15849f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard WebCore::IntRect inval; 15859f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard int titlebarHeight = webViewRect.height() - viewRect.height(); 1586b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner 1587b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner uirenderer::DrawGlInfo* info = reinterpret_cast<uirenderer::DrawGlInfo*>(data); 1588b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner WebCore::IntRect localViewRect = viewRect; 1589b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner if (info->isLayer) 1590b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner localViewRect.move(-1 * localViewRect.x(), -1 * localViewRect.y()); 1591b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner 1592be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard WebCore::IntRect clip(info->clipLeft, info->clipTop, 1593be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard info->clipRight - info->clipLeft, 1594be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard info->clipBottom - info->clipTop); 1595e7770b07e6dd4b0edff8725bc0f7a505417dd4f1Teng-Hui Zhu TilesManager::instance()->shader()->setWebViewMatrix(info->transform, info->isLayer); 1596be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard 1597a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount bool retVal = (*wvInstance.*funcPtr)(localViewRect, &inval, webViewRect, 1598a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount titlebarHeight, clip, scale, extras); 1599b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy if (retVal) { 16009f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard IntRect finalInval; 16019f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard if (inval.isEmpty()) { 16029f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard finalInval = webViewRect; 1603be25f896a5c754e96c6c0d4719a79d523293d40fNicolas Roard retVal = true; 16049f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard } else { 16059f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard finalInval.setX(webViewRect.x() + inval.x()); 1606be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard finalInval.setY(webViewRect.y() + titlebarHeight + inval.y()); 16079f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard finalInval.setWidth(inval.width()); 16089f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard finalInval.setHeight(inval.height()); 16099f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard } 1610d1f5cf1ad8b20860bd9cb34a483451019124d1f9Romain Guy info->dirtyLeft = finalInval.x(); 1611d1f5cf1ad8b20860bd9cb34a483451019124d1f9Romain Guy info->dirtyTop = finalInval.y(); 16121ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block info->dirtyRight = finalInval.maxX(); 16131ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block info->dirtyBottom = finalInval.maxY(); 1614b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy } 1615908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase // return 1 if invalidation needed, 0 otherwise 1616908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase return retVal ? 1 : 0; 1617908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase } 1618908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase void updateRect(WebCore::IntRect& _viewRect) { 1619908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase viewRect = _viewRect; 1620908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase } 1621b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy void updateViewRect(WebCore::IntRect& _viewRect) { 1622b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy webViewRect = _viewRect; 1623b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy } 1624908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase private: 1625908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase WebView* wvInstance; 1626a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount bool (WebView::*funcPtr)(WebCore::IntRect&, WebCore::IntRect*, 1627a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount WebCore::IntRect&, int, WebCore::IntRect&, float, int); 1628908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase WebCore::IntRect viewRect; 1629b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy WebCore::IntRect webViewRect; 1630908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase jfloat scale; 1631908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase jint extras; 1632908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}; 1633908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase 1634040d9e4815004690561231442e069cc67cba600fChris Craikstatic jobject createJavaRect(JNIEnv* env, int x, int y, int right, int bottom) 1635040d9e4815004690561231442e069cc67cba600fChris Craik{ 1636040d9e4815004690561231442e069cc67cba600fChris Craik jclass rectClass = env->FindClass("android/graphics/Rect"); 1637040d9e4815004690561231442e069cc67cba600fChris Craik jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V"); 1638040d9e4815004690561231442e069cc67cba600fChris Craik jobject rect = env->NewObject(rectClass, init, x, y, right, bottom); 1639040d9e4815004690561231442e069cc67cba600fChris Craik env->DeleteLocalRef(rectClass); 1640040d9e4815004690561231442e069cc67cba600fChris Craik return rect; 1641040d9e4815004690561231442e069cc67cba600fChris Craik} 1642040d9e4815004690561231442e069cc67cba600fChris Craik 16438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 16448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Native JNI methods 16458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 1646d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkstatic int nativeCacheHitFramePointer(JNIEnv *env, jobject obj) 1647d4924af12855cd19162ba1442a6055664c98ca32Cary Clark{ 1648d4924af12855cd19162ba1442a6055664c98ca32Cary Clark return reinterpret_cast<int>(GET_NATIVE_VIEW(env, obj) 1649d4924af12855cd19162ba1442a6055664c98ca32Cary Clark ->m_cacheHitFrame->framePointer()); 1650d4924af12855cd19162ba1442a6055664c98ca32Cary Clark} 1651d4924af12855cd19162ba1442a6055664c98ca32Cary Clark 1652d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkstatic jobject nativeCacheHitNodeBounds(JNIEnv *env, jobject obj) 1653d4924af12855cd19162ba1442a6055664c98ca32Cary Clark{ 1654d4924af12855cd19162ba1442a6055664c98ca32Cary Clark WebCore::IntRect bounds = GET_NATIVE_VIEW(env, obj) 1655d4924af12855cd19162ba1442a6055664c98ca32Cary Clark ->m_cacheHitNode->originalAbsoluteBounds(); 1656040d9e4815004690561231442e069cc67cba600fChris Craik return createJavaRect(env, bounds.x(), bounds.y(), 1657040d9e4815004690561231442e069cc67cba600fChris Craik bounds.maxX(), bounds.maxY()); 1658d4924af12855cd19162ba1442a6055664c98ca32Cary Clark} 1659d4924af12855cd19162ba1442a6055664c98ca32Cary Clark 1660d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkstatic int nativeCacheHitNodePointer(JNIEnv *env, jobject obj) 1661d4924af12855cd19162ba1442a6055664c98ca32Cary Clark{ 1662d4924af12855cd19162ba1442a6055664c98ca32Cary Clark return reinterpret_cast<int>(GET_NATIVE_VIEW(env, obj) 1663d4924af12855cd19162ba1442a6055664c98ca32Cary Clark ->m_cacheHitNode->nodePointer()); 1664d4924af12855cd19162ba1442a6055664c98ca32Cary Clark} 1665d4924af12855cd19162ba1442a6055664c98ca32Cary Clark 1666b57c3a124715a89ac026e86f4fd3890529525d11Cary Clarkstatic bool nativeCacheHitIsPlugin(JNIEnv *env, jobject obj) 1667b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark{ 1668b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark return GET_NATIVE_VIEW(env, obj)->m_cacheHitNode->isPlugin(); 1669b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark} 1670b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark 1671c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clarkstatic void nativeClearCursor(JNIEnv *env, jobject obj) 16728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 16748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 1675c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark view->clearCursor(); 16768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 167855b4bdbd661ac94fd05ab40de08250bf242d5346John Reckstatic void nativeCreate(JNIEnv *env, jobject obj, int viewImpl, 167955b4bdbd661ac94fd05ab40de08250bf242d5346John Reck jstring drawableDir, jboolean isHighEndGfx) 16808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16814de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins WTF::String dir = jstringToWtfString(env, drawableDir); 168255b4bdbd661ac94fd05ab40de08250bf242d5346John Reck WebView* webview = new WebView(env, obj, viewImpl, dir, isHighEndGfx); 16838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // NEED THIS OR SOMETHING LIKE IT! 16848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project //Release(obj); 16858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 168746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jint nativeCursorFramePointer(JNIEnv *env, jobject obj) 168846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 168946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark WebView* view = GET_NATIVE_VIEW(env, obj); 169046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer); 169146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark if (!root) 169246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return 0; 169346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark const CachedFrame* frame = 0; 169446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void) root->currentCursor(&frame); 169546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return reinterpret_cast<int>(frame ? frame->framePointer() : 0); 169646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 169746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 169846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic const CachedNode* getCursorNode(JNIEnv *env, jobject obj) 169946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 170046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark WebView* view = GET_NATIVE_VIEW(env, obj); 170146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer); 170246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return root ? root->currentCursor() : 0; 170346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 170446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 17051d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clarkstatic const CachedNode* getCursorNode(JNIEnv *env, jobject obj, 17061d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark const CachedFrame** frame) 17071d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark{ 17081d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark WebView* view = GET_NATIVE_VIEW(env, obj); 17091d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer); 17101d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark return root ? root->currentCursor(frame) : 0; 17111d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark} 17121d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark 1713f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clarkstatic const CachedNode* getFocusCandidate(JNIEnv *env, jobject obj, 1714f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedFrame** frame) 1715f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark{ 1716f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark WebView* view = GET_NATIVE_VIEW(env, obj); 1717f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer); 1718f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark if (!root) 1719f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark return 0; 1720f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedNode* cursor = root->currentCursor(frame); 1721f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark if (cursor && cursor->wantsKeyEvents()) 1722f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark return cursor; 17234ca469897f8dc36063e262faccefe4b8eacb9e7bCary Clark return root->currentFocus(frame); 1724f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark} 1725f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark 17262194b17e89b2ad4c0624f7612e417db6d69150adLeon Scrogginsstatic bool focusCandidateHasNextTextfield(JNIEnv *env, jobject obj) 17272194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins{ 172865966ae193adfef8d40419ad9c11515b0e56f257Cary Clark WebView* view = GET_NATIVE_VIEW(env, obj); 172965966ae193adfef8d40419ad9c11515b0e56f257Cary Clark CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer); 173065966ae193adfef8d40419ad9c11515b0e56f257Cary Clark if (!root) 173165966ae193adfef8d40419ad9c11515b0e56f257Cary Clark return false; 173265966ae193adfef8d40419ad9c11515b0e56f257Cary Clark const CachedNode* cursor = root->currentCursor(); 173365966ae193adfef8d40419ad9c11515b0e56f257Cary Clark if (!cursor || !cursor->isTextInput()) 173465966ae193adfef8d40419ad9c11515b0e56f257Cary Clark cursor = root->currentFocus(); 17352194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins if (!cursor || !cursor->isTextInput()) return false; 173665966ae193adfef8d40419ad9c11515b0e56f257Cary Clark return root->nextTextField(cursor, 0); 17372194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins} 17382194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins 173946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic const CachedNode* getFocusNode(JNIEnv *env, jobject obj) 174046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 174146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark WebView* view = GET_NATIVE_VIEW(env, obj); 174246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer); 174346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return root ? root->currentFocus() : 0; 174446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 174546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 17468026280044128436d8e89736519a0b32b6540201Cary Clarkstatic const CachedNode* getFocusNode(JNIEnv *env, jobject obj, 17478026280044128436d8e89736519a0b32b6540201Cary Clark const CachedFrame** frame) 17488026280044128436d8e89736519a0b32b6540201Cary Clark{ 17498026280044128436d8e89736519a0b32b6540201Cary Clark WebView* view = GET_NATIVE_VIEW(env, obj); 17508026280044128436d8e89736519a0b32b6540201Cary Clark CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer); 17518026280044128436d8e89736519a0b32b6540201Cary Clark return root ? root->currentFocus(frame) : 0; 17528026280044128436d8e89736519a0b32b6540201Cary Clark} 17538026280044128436d8e89736519a0b32b6540201Cary Clark 17541d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clarkstatic const CachedInput* getInputCandidate(JNIEnv *env, jobject obj) 17551d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark{ 17561d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark WebView* view = GET_NATIVE_VIEW(env, obj); 17571d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer); 17581d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark if (!root) 17591d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark return 0; 17601d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark const CachedFrame* frame; 17611d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark const CachedNode* cursor = root->currentCursor(&frame); 17621d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark if (!cursor || !cursor->wantsKeyEvents()) 17631d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark cursor = root->currentFocus(&frame); 17641d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark return cursor ? frame->textInput(cursor) : 0; 17651d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark} 17661d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark 17671cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scrogginsstatic jboolean nativePageShouldHandleShiftAndArrows(JNIEnv *env, jobject obj) 17681cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins{ 17691cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins const CachedNode* focus = getFocusNode(env, obj); 17701cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins if (!focus) return false; 17711cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins // Plugins handle shift and arrows whether or not they have focus. 17721cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins if (focus->isPlugin()) return true; 17731cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins const CachedNode* cursor = getCursorNode(env, obj); 17741cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins // ContentEditable nodes should only receive shift and arrows if they have 17751cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins // both the cursor and the focus. 17761cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins return cursor && cursor->nodePointer() == focus->nodePointer() 17771cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins && cursor->isContentEditable(); 17781cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins} 17791cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins 178046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jobject nativeCursorNodeBounds(JNIEnv *env, jobject obj) 178146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 1782f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedFrame* frame; 1783f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedNode* node = getCursorNode(env, obj, &frame); 1784f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark WebCore::IntRect bounds = node ? node->bounds(frame) 178546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark : WebCore::IntRect(0, 0, 0, 0); 1786040d9e4815004690561231442e069cc67cba600fChris Craik return createJavaRect(env, bounds.x(), bounds.y(), 1787040d9e4815004690561231442e069cc67cba600fChris Craik bounds.maxX(), bounds.maxY()); 178846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 178946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 179046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jint nativeCursorNodePointer(JNIEnv *env, jobject obj) 179146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 179246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark const CachedNode* node = getCursorNode(env, obj); 179346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return reinterpret_cast<int>(node ? node->nodePointer() : 0); 179446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 179546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 179636747fa778285f57f2f53c047028be83e9d8776dCary Clarkstatic jobject nativeCursorPosition(JNIEnv *env, jobject obj) 179736747fa778285f57f2f53c047028be83e9d8776dCary Clark{ 179836747fa778285f57f2f53c047028be83e9d8776dCary Clark WebView* view = GET_NATIVE_VIEW(env, obj); 17990181faa1ffede024c2712df19ae7c855a8cf64e3Cary Clark const CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer); 180036747fa778285f57f2f53c047028be83e9d8776dCary Clark WebCore::IntPoint pos = WebCore::IntPoint(0, 0); 180136747fa778285f57f2f53c047028be83e9d8776dCary Clark if (root) 180219194ea29920c2f7a02d08dfb0416608bc81dbb7Leon Scroggins root->getSimulatedMousePosition(&pos); 180336747fa778285f57f2f53c047028be83e9d8776dCary Clark jclass pointClass = env->FindClass("android/graphics/Point"); 180436747fa778285f57f2f53c047028be83e9d8776dCary Clark jmethodID init = env->GetMethodID(pointClass, "<init>", "(II)V"); 180536747fa778285f57f2f53c047028be83e9d8776dCary Clark jobject point = env->NewObject(pointClass, init, pos.x(), pos.y()); 1806bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block env->DeleteLocalRef(pointClass); 180736747fa778285f57f2f53c047028be83e9d8776dCary Clark return point; 180836747fa778285f57f2f53c047028be83e9d8776dCary Clark} 180936747fa778285f57f2f53c047028be83e9d8776dCary Clark 181046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic WebCore::IntRect jrect_to_webrect(JNIEnv* env, jobject obj) 181146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 1812a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount if (obj) { 1813a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount int L, T, R, B; 1814a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount GraphicsJNI::get_jrect(env, obj, &L, &T, &R, &B); 1815a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount return WebCore::IntRect(L, T, R - L, B - T); 1816a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount } else 1817a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount return WebCore::IntRect(); 1818a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount} 1819a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount 1820a5e649bc4d58bf3da959deae077307c487e2a3a6George Mountstatic SkRect jrectf_to_rect(JNIEnv* env, jobject obj) 1821a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount{ 1822a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount SkRect rect = SkRect::MakeEmpty(); 1823a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount if (obj) 1824a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount GraphicsJNI::jrectf_to_rect(env, obj, &rect); 1825a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount return rect; 182646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 182746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 182846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic bool nativeCursorIntersects(JNIEnv *env, jobject obj, jobject visRect) 182946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 1830f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedFrame* frame; 1831f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedNode* node = getCursorNode(env, obj, &frame); 1832f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark return node ? node->bounds(frame).intersects( 1833f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark jrect_to_webrect(env, visRect)) : false; 183446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 183546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 183646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic bool nativeCursorIsAnchor(JNIEnv *env, jobject obj) 183746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 183846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark const CachedNode* node = getCursorNode(env, obj); 183946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return node ? node->isAnchor() : false; 184046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 184146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 184246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic bool nativeCursorIsTextInput(JNIEnv *env, jobject obj) 184346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 184446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark const CachedNode* node = getCursorNode(env, obj); 18451d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark return node ? node->isTextInput() : false; 184646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 184746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 184846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jobject nativeCursorText(JNIEnv *env, jobject obj) 184946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 185046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark const CachedNode* node = getCursorNode(env, obj); 185146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark if (!node) 185246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return 0; 185345b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch WTF::String value = node->getExport(); 185479b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block return wtfStringToJstring(env, value); 185546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 185646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 18578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeDebugDump(JNIEnv *env, jobject obj) 18588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if DUMP_NAV_CACHE 18608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 18618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 18628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view->debugDump(); 18638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 18648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1866a5e649bc4d58bf3da959deae077307c487e2a3a6George Mountstatic jint nativeDraw(JNIEnv *env, jobject obj, jobject canv, 1867a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount jobject visible, jint color, 18686d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba jint extras, jboolean split) { 18698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SkCanvas* canvas = GraphicsJNI::getNativeCanvas(env, canv); 1870a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount WebView* webView = GET_NATIVE_VIEW(env, obj); 1871a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount SkRect visibleRect = jrectf_to_rect(env, visible); 1872a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount webView->setVisibleRect(visibleRect); 1873a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount PictureSet* pictureSet = webView->draw(canvas, color, extras, split); 1874a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount return reinterpret_cast<jint>(pictureSet); 18758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1877223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reckstatic jint nativeGetDrawGLFunction(JNIEnv *env, jobject obj, jint nativeView, 1878223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck jobject jrect, jobject jviewrect, 1879a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount jobject jvisiblerect, 1880223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck jfloat scale, jint extras) { 1881a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount WebCore::IntRect viewRect = jrect_to_webrect(env, jrect); 1882223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck WebView *wvInstance = (WebView*) nativeView; 1883a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount SkRect visibleRect = jrectf_to_rect(env, jvisiblerect); 1884a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount wvInstance->setVisibleRect(visibleRect); 1885a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount 1886a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount GLDrawFunctor* functor = new GLDrawFunctor(wvInstance, 1887a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount &android::WebView::drawGL, viewRect, scale, extras); 1888908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase wvInstance->setFunctor((Functor*) functor); 1889b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy 1890a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount WebCore::IntRect webViewRect = jrect_to_webrect(env, jviewrect); 1891b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy functor->updateViewRect(webViewRect); 1892b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy 1893908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase return (jint)functor; 1894908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase} 1895908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase 1896a5e649bc4d58bf3da959deae077307c487e2a3a6George Mountstatic void nativeUpdateDrawGLFunction(JNIEnv *env, jobject obj, jobject jrect, 1897a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount jobject jviewrect, jobject jvisiblerect) { 1898908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase WebView *wvInstance = GET_NATIVE_VIEW(env, obj); 1899a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount if (wvInstance) { 1900908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase GLDrawFunctor* functor = (GLDrawFunctor*) wvInstance->getFunctor(); 1901a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount if (functor) { 1902a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount WebCore::IntRect viewRect = jrect_to_webrect(env, jrect); 1903908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase functor->updateRect(viewRect); 1904b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy 1905a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount SkRect visibleRect = jrectf_to_rect(env, jvisiblerect); 1906a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount wvInstance->setVisibleRect(visibleRect); 1907a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount 1908a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount WebCore::IntRect webViewRect = jrect_to_webrect(env, jviewrect); 1909b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy functor->updateViewRect(webViewRect); 1910908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase } 1911908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase } 1912908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase} 1913908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase 1914223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reckstatic bool nativeEvaluateLayersAnimations(JNIEnv *env, jobject obj, jint nativeView) 1915797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{ 1916c6151a04881a67d08d91237891fbc7cb82927219John Reck // only call in software rendering, initialize and evaluate animations 1917797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#if USE(ACCELERATED_COMPOSITING) 1918223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck LayerAndroid* root = ((WebView*)nativeView)->compositeRoot(); 1919c6151a04881a67d08d91237891fbc7cb82927219John Reck if (root) { 1920c6151a04881a67d08d91237891fbc7cb82927219John Reck root->initAnimations(); 192187962ce00229855c098ba12cee8d5c015a835289Cary Clark return root->evaluateAnimations(); 1922c6151a04881a67d08d91237891fbc7cb82927219John Reck } 1923797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#endif 1924797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard return false; 1925797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard} 1926797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 192767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roardstatic void nativeSetBaseLayer(JNIEnv *env, jobject obj, jint layer, jobject inval, 19286a3bd3f2b6b5a5c80e5fc1674550456b67e2cc7cShimeng (Simon) Wang jboolean showVisualIndicator, 192996eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik jboolean isPictureAfterFirstLayout, 193096eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik jboolean registerPageSwapCallback) 1931f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{ 19326d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba BaseLayerAndroid* layerImpl = reinterpret_cast<BaseLayerAndroid*>(layer); 193367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard SkRegion invalRegion; 193467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (inval) 193567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard invalRegion = *GraphicsJNI::getNativeRegion(env, inval); 19366a3bd3f2b6b5a5c80e5fc1674550456b67e2cc7cShimeng (Simon) Wang GET_NATIVE_VIEW(env, obj)->setBaseLayer(layerImpl, invalRegion, showVisualIndicator, 193796eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik isPictureAfterFirstLayout, 193896eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik registerPageSwapCallback); 19396d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba} 19406d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba 1941e94313e95fb5e08870a58c7a4b593da08cc3d424John Reckstatic void nativeGetTextSelectionRegion(JNIEnv *env, jobject obj, jint view, 1942e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck jobject region) 19438111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck{ 19448111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck if (!region) 19458111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck return; 19468111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck SkRegion* nregion = GraphicsJNI::getNativeRegion(env, region); 1947e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck ((WebView*)view)->getTextSelectionRegion(nregion); 1948e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck} 1949e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck 1950e94313e95fb5e08870a58c7a4b593da08cc3d424John Reckstatic void nativeGetSelectionHandles(JNIEnv *env, jobject obj, jint view, 1951e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck jintArray arr) 1952e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck{ 1953e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck int handles[4]; 1954e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck ((WebView*)view)->getTextSelectionHandles(handles); 1955e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck env->SetIntArrayRegion(arr, 0, 4, handles); 1956e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck checkException(env); 19578111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck} 19588111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck 19594212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reckstatic BaseLayerAndroid* nativeGetBaseLayer(JNIEnv *env, jobject obj) 19604212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck{ 19614212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck return GET_NATIVE_VIEW(env, obj)->getBaseLayer(); 19624212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck} 19634212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck 19646d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic void nativeReplaceBaseContent(JNIEnv *env, jobject obj, jint content) 19656d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{ 19666d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba PictureSet* set = reinterpret_cast<PictureSet*>(content); 19676d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba GET_NATIVE_VIEW(env, obj)->replaceBaseContent(set); 19686d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba} 19696d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba 19706d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic void nativeCopyBaseContentToPicture(JNIEnv *env, jobject obj, jobject pict) 19716d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{ 19726d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba SkPicture* picture = GraphicsJNI::getNativePicture(env, pict); 19736d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba GET_NATIVE_VIEW(env, obj)->copyBaseContentToPicture(picture); 19746d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba} 19756d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba 19766d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic bool nativeHasContent(JNIEnv *env, jobject obj) 19776d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{ 19786d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return GET_NATIVE_VIEW(env, obj)->hasContent(); 1979f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark} 1980f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark 19818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jobject nativeImageURI(JNIEnv *env, jobject obj, jint x, jint y) 19828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 19838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 19848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 198545b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch WTF::String uri = view->imageURI(x, y); 198679b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block return wtfStringToJstring(env, uri); 19878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 19888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 198949e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clarkstatic jint nativeFocusCandidateFramePointer(JNIEnv *env, jobject obj) 199049e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark{ 199149e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark WebView* view = GET_NATIVE_VIEW(env, obj); 199249e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer); 199349e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark if (!root) 199449e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark return 0; 199549e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark const CachedFrame* frame = 0; 199649e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark const CachedNode* cursor = root->currentCursor(&frame); 199749e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark if (!cursor || !cursor->wantsKeyEvents()) 199849e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark (void) root->currentFocus(&frame); 199949e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark return reinterpret_cast<int>(frame ? frame->framePointer() : 0); 200049e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark} 200149e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark 2002bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic bool nativeFocusCandidateIsPassword(JNIEnv *env, jobject obj) 200346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 20041d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark const CachedInput* input = getInputCandidate(env, obj); 2005737a377f81baa2bf868b48f3457cc9a53cea2e6eBen Murdoch return input && input->getType() == CachedInput::PASSWORD; 200646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 200746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 2008bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic bool nativeFocusCandidateIsRtlText(JNIEnv *env, jobject obj) 200946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 20101d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark const CachedInput* input = getInputCandidate(env, obj); 20111d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark return input ? input->isRtlText() : false; 201246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 201346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 2014bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic bool nativeFocusCandidateIsTextInput(JNIEnv *env, jobject obj) 201546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 2016f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedNode* node = getFocusCandidate(env, obj, 0); 20171d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark return node ? node->isTextInput() : false; 201846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 201946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 2020bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic jint nativeFocusCandidateMaxLength(JNIEnv *env, jobject obj) 202146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 20221d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark const CachedInput* input = getInputCandidate(env, obj); 20231d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark return input ? input->maxLength() : false; 202446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 202546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 2026ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scrogginsstatic jint nativeFocusCandidateIsAutoComplete(JNIEnv *env, jobject obj) 2027ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins{ 2028ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins const CachedInput* input = getInputCandidate(env, obj); 2029ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins return input ? input->autoComplete() : false; 2030ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins} 2031ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins 2032bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic jobject nativeFocusCandidateName(JNIEnv *env, jobject obj) 203346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 20341d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark const CachedInput* input = getInputCandidate(env, obj); 20351d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark if (!input) 203646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return 0; 203745b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch const WTF::String& name = input->name(); 203879b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block return wtfStringToJstring(env, name); 203946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 204046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 2041bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic jobject nativeFocusCandidateNodeBounds(JNIEnv *env, jobject obj) 204246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 2043f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedFrame* frame; 2044f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedNode* node = getFocusCandidate(env, obj, &frame); 204570d105810a06e7cb69f606635b916694ab15b4dcMichael Kolb WebCore::IntRect bounds = node ? node->originalAbsoluteBounds() 204646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark : WebCore::IntRect(0, 0, 0, 0); 2047040d9e4815004690561231442e069cc67cba600fChris Craik // Inset the rect by 1 unit, so that the focus candidate's border can still 2048040d9e4815004690561231442e069cc67cba600fChris Craik // be seen behind it. 2049e5c39206de45588678bf718a8274432068d702f6Michael Kolb return createJavaRect(env, bounds.x(), bounds.y(), 2050e5c39206de45588678bf718a8274432068d702f6Michael Kolb bounds.maxX(), bounds.maxY()); 2051390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins} 2052390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins 2053390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scrogginsstatic jobject nativeFocusCandidatePaddingRect(JNIEnv *env, jobject obj) 2054390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins{ 2055390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins const CachedInput* input = getInputCandidate(env, obj); 2056390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins if (!input) 2057390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins return 0; 2058390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins // Note that the Java Rect is being used to pass four integers, rather than 2059390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins // being used as an actual rectangle. 2060390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins return createJavaRect(env, input->paddingLeft(), input->paddingTop(), 2061390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins input->paddingRight(), input->paddingBottom()); 206246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 206346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 2064bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic jint nativeFocusCandidatePointer(JNIEnv *env, jobject obj) 206546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 2066f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedNode* node = getFocusCandidate(env, obj, 0); 206746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return reinterpret_cast<int>(node ? node->nodePointer() : 0); 206846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 206946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 207085e3844824444f304a15e57f62d2e5670fb3bf47Michael Kolbstatic jint nativeFocusCandidateIsSpellcheck(JNIEnv *env, jobject obj) 207185e3844824444f304a15e57f62d2e5670fb3bf47Michael Kolb{ 207285e3844824444f304a15e57f62d2e5670fb3bf47Michael Kolb const CachedInput* input = getInputCandidate(env, obj); 207385e3844824444f304a15e57f62d2e5670fb3bf47Michael Kolb return input ? input->spellcheck() : false; 207485e3844824444f304a15e57f62d2e5670fb3bf47Michael Kolb} 207585e3844824444f304a15e57f62d2e5670fb3bf47Michael Kolb 2076bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic jobject nativeFocusCandidateText(JNIEnv *env, jobject obj) 207746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 2078f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedNode* node = getFocusCandidate(env, obj, 0); 207946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark if (!node) 208046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return 0; 208145b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch WTF::String value = node->getExport(); 208279b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block return wtfStringToJstring(env, value); 208346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 208446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 2085d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scrogginsstatic int nativeFocusCandidateLineHeight(JNIEnv *env, jobject obj) 2086d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins{ 2087d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins const CachedInput* input = getInputCandidate(env, obj); 2088d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins return input ? input->lineHeight() : 0; 2089d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins} 2090d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins 20913a3b28707d2d6a06afe9f3137e9bedc07246d600Leon Scrogginsstatic jfloat nativeFocusCandidateTextSize(JNIEnv *env, jobject obj) 209246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 20931d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark const CachedInput* input = getInputCandidate(env, obj); 20943a3b28707d2d6a06afe9f3137e9bedc07246d600Leon Scroggins return input ? input->textSize() : 0.f; 209546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 209646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 209774757b62fce144f27c25cc7744df82cd7411b2dcLeon Scrogginsstatic int nativeFocusCandidateType(JNIEnv *env, jobject obj) 209874757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins{ 209974757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins const CachedInput* input = getInputCandidate(env, obj); 210041c8cd06bd25769654e321d1222856182ebad067Ben Murdoch if (!input) 2101737a377f81baa2bf868b48f3457cc9a53cea2e6eBen Murdoch return CachedInput::NONE; 210241c8cd06bd25769654e321d1222856182ebad067Ben Murdoch 210341c8cd06bd25769654e321d1222856182ebad067Ben Murdoch if (input->isTextArea()) 2104737a377f81baa2bf868b48f3457cc9a53cea2e6eBen Murdoch return CachedInput::TEXT_AREA; 2105737a377f81baa2bf868b48f3457cc9a53cea2e6eBen Murdoch 2106737a377f81baa2bf868b48f3457cc9a53cea2e6eBen Murdoch return input->getType(); 210774757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins} 210874757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins 2109d635c32628b7d9760bf786613cbe3eddf98a1272Michael Kolbstatic int nativeFocusCandidateLayerId(JNIEnv *env, jobject obj) 2110d635c32628b7d9760bf786613cbe3eddf98a1272Michael Kolb{ 2111d635c32628b7d9760bf786613cbe3eddf98a1272Michael Kolb const CachedFrame* frame; 2112d635c32628b7d9760bf786613cbe3eddf98a1272Michael Kolb const CachedNode* node = getFocusNode(env, obj, &frame); 2113d635c32628b7d9760bf786613cbe3eddf98a1272Michael Kolb if (!node) 2114d635c32628b7d9760bf786613cbe3eddf98a1272Michael Kolb return -1; 2115d635c32628b7d9760bf786613cbe3eddf98a1272Michael Kolb return frame->layer(node)->uniqueId(); 2116d635c32628b7d9760bf786613cbe3eddf98a1272Michael Kolb} 2117d635c32628b7d9760bf786613cbe3eddf98a1272Michael Kolb 2118c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenbergerstatic bool nativeFocusIsPlugin(JNIEnv *env, jobject obj) 2119c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger{ 2120c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger const CachedNode* node = getFocusNode(env, obj); 2121c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger return node ? node->isPlugin() : false; 2122c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger} 2123c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger 21248026280044128436d8e89736519a0b32b6540201Cary Clarkstatic jobject nativeFocusNodeBounds(JNIEnv *env, jobject obj) 21258026280044128436d8e89736519a0b32b6540201Cary Clark{ 21268026280044128436d8e89736519a0b32b6540201Cary Clark const CachedFrame* frame; 21278026280044128436d8e89736519a0b32b6540201Cary Clark const CachedNode* node = getFocusNode(env, obj, &frame); 21288026280044128436d8e89736519a0b32b6540201Cary Clark WebCore::IntRect bounds = node ? node->bounds(frame) 21298026280044128436d8e89736519a0b32b6540201Cary Clark : WebCore::IntRect(0, 0, 0, 0); 2130040d9e4815004690561231442e069cc67cba600fChris Craik return createJavaRect(env, bounds.x(), bounds.y(), 2131040d9e4815004690561231442e069cc67cba600fChris Craik bounds.maxX(), bounds.maxY()); 21328026280044128436d8e89736519a0b32b6540201Cary Clark} 21338026280044128436d8e89736519a0b32b6540201Cary Clark 2134539427bc7572dfd8b28579c67460186406dcb246Leon Scrogginsstatic jint nativeFocusNodePointer(JNIEnv *env, jobject obj) 2135539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins{ 2136539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins const CachedNode* node = getFocusNode(env, obj); 2137539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins return node ? reinterpret_cast<int>(node->nodePointer()) : 0; 2138539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins} 2139539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins 2140f4669cac3858848a9247e801b6106aeae6d406e8Cary Clarkstatic bool nativeCursorWantsKeyEvents(JNIEnv* env, jobject jwebview) { 21418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, jwebview); 21428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 2143f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark return view->cursorWantsKeyEvents(); 21448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2146c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clarkstatic void nativeHideCursor(JNIEnv *env, jobject obj) 2147c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark{ 2148c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark WebView* view = GET_NATIVE_VIEW(env, obj); 2149c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 2150c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark view->hideCursor(); 2151c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark} 2152c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark 21538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeInstrumentReport(JNIEnv *env, jobject obj) 21548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_INSTRUMENT 21568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project TimeCounter::reportNow(); 21578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 21588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeSelectBestAt(JNIEnv *env, jobject obj, jobject jrect) 21618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 21638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 21648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebCore::IntRect rect = jrect_to_webrect(env, jrect); 21658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view->selectBestAt(rect); 21668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21681b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganovstatic void nativeSelectAt(JNIEnv *env, jobject obj, jint x, jint y) 21691b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov{ 21701b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov WebView* view = GET_NATIVE_VIEW(env, obj); 21711b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 21721b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov WebCore::IntRect rect = IntRect(x, y , 1, 1); 21731b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov view->selectBestAt(rect); 21741b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov if (view->hasCursorNode()) 21751b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov view->showCursorUntimed(); 21761b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov} 21771b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov 21789092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clarkstatic jobject nativeLayerBounds(JNIEnv* env, jobject obj, jint jlayer) 21799092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark{ 21809092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark SkRect r; 21819092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark#if USE(ACCELERATED_COMPOSITING) 21829092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark LayerAndroid* layer = (LayerAndroid*) jlayer; 21839092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark r = layer->bounds(); 21849092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark#else 21859092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark r.setEmpty(); 21869092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark#endif 21879092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark SkIRect irect; 21889092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark r.round(&irect); 21899092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark jclass rectClass = env->FindClass("android/graphics/Rect"); 21909092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V"); 21919092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark jobject rect = env->NewObject(rectClass, init, irect.fLeft, irect.fTop, 21929092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark irect.fRight, irect.fBottom); 21939092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark env->DeleteLocalRef(rectClass); 21949092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark return rect; 21959092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark} 21969092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark 2197cc4e3c422964c7d999e8f340057f303140d845ddCary Clarkstatic jobject nativeSubtractLayers(JNIEnv* env, jobject obj, jobject jrect) 2198cc4e3c422964c7d999e8f340057f303140d845ddCary Clark{ 2199cc4e3c422964c7d999e8f340057f303140d845ddCary Clark SkIRect irect = jrect_to_webrect(env, jrect); 2200cc4e3c422964c7d999e8f340057f303140d845ddCary Clark#if USE(ACCELERATED_COMPOSITING) 22016d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba LayerAndroid* root = GET_NATIVE_VIEW(env, obj)->compositeRoot(); 2202cc4e3c422964c7d999e8f340057f303140d845ddCary Clark if (root) { 2203cc4e3c422964c7d999e8f340057f303140d845ddCary Clark SkRect rect; 2204cc4e3c422964c7d999e8f340057f303140d845ddCary Clark rect.set(irect); 2205cc4e3c422964c7d999e8f340057f303140d845ddCary Clark rect = root->subtractLayers(rect); 2206cc4e3c422964c7d999e8f340057f303140d845ddCary Clark rect.round(&irect); 2207cc4e3c422964c7d999e8f340057f303140d845ddCary Clark } 2208cc4e3c422964c7d999e8f340057f303140d845ddCary Clark#endif 2209cc4e3c422964c7d999e8f340057f303140d845ddCary Clark jclass rectClass = env->FindClass("android/graphics/Rect"); 2210cc4e3c422964c7d999e8f340057f303140d845ddCary Clark jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V"); 2211bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block jobject rect = env->NewObject(rectClass, init, irect.fLeft, irect.fTop, 2212cc4e3c422964c7d999e8f340057f303140d845ddCary Clark irect.fRight, irect.fBottom); 2213bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block env->DeleteLocalRef(rectClass); 2214bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block return rect; 2215cc4e3c422964c7d999e8f340057f303140d845ddCary Clark} 2216cc4e3c422964c7d999e8f340057f303140d845ddCary Clark 221746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jint nativeTextGeneration(JNIEnv *env, jobject obj) 221846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 221946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark WebView* view = GET_NATIVE_VIEW(env, obj); 222046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer); 222146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return root ? root->textGeneration() : 0; 222246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 222346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 2224d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkstatic bool nativePointInNavCache(JNIEnv *env, jobject obj, 2225d4924af12855cd19162ba1442a6055664c98ca32Cary Clark int x, int y, int slop) 2226d4924af12855cd19162ba1442a6055664c98ca32Cary Clark{ 2227d4924af12855cd19162ba1442a6055664c98ca32Cary Clark return GET_NATIVE_VIEW(env, obj)->pointInNavCache(x, y, slop); 2228d4924af12855cd19162ba1442a6055664c98ca32Cary Clark} 2229d4924af12855cd19162ba1442a6055664c98ca32Cary Clark 22308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool nativeMotionUp(JNIEnv *env, jobject obj, 2231d48434fc633d173b549b97b1c614072adc9648a8Cary Clark int x, int y, int slop) 22328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 22348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 223546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return view->motionUp(x, y, slop); 22368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 223846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic bool nativeHasCursorNode(JNIEnv *env, jobject obj) 22398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 224046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return GET_NATIVE_VIEW(env, obj)->hasCursorNode(); 22418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 224346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic bool nativeHasFocusNode(JNIEnv *env, jobject obj) 22448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 224546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return GET_NATIVE_VIEW(env, obj)->hasFocusNode(); 22468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2248bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic bool nativeMoveCursor(JNIEnv *env, jobject obj, 224946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark int key, int count, bool ignoreScroll) 22508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 225246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark DBG_NAV_LOGD("env=%p obj=%p view=%p", env, obj, view); 22538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 22544ca8bc94f71466d1109bfbb9ef00da3256a0899bCary Clark return view->moveCursor(key, count, ignoreScroll); 22558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2257afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clarkstatic void nativeSetFindIsUp(JNIEnv *env, jobject obj, jboolean isUp) 22588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 22608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 2261afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark view->setFindIsUp(isUp); 2262afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark} 2263afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark 2264afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clarkstatic void nativeSetFindIsEmpty(JNIEnv *env, jobject obj) 2265afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark{ 2266afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark GET_NATIVE_VIEW(env, obj)->setFindIsEmpty(); 22678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 226932dffb883f56b18019afa7a01b2564b993b3fe8eCary Clarkstatic void nativeShowCursorTimed(JNIEnv *env, jobject obj) 22708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 227132dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark GET_NATIVE_VIEW(env, obj)->showCursorTimed(); 22728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeSetHeightCanMeasure(JNIEnv *env, jobject obj, bool measure) 22758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 22778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in nativeSetHeightCanMeasure"); 22788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view->setHeightCanMeasure(measure); 22798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 228146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jobject nativeGetCursorRingBounds(JNIEnv *env, jobject obj) 22828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 22848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 22858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jclass rectClass = env->FindClass("android/graphics/Rect"); 22868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(rectClass, "Could not find Rect class!"); 22878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V"); 22888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(init, "Could not find constructor for Rect"); 22898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebCore::IntRect webRect; 229046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark view->cursorRingBounds(&webRect); 22918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jobject rect = env->NewObject(rectClass, init, webRect.x(), 22921ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block webRect.y(), webRect.maxX(), webRect.maxY()); 2293bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block env->DeleteLocalRef(rectClass); 22948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return rect; 22958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic int nativeFindAll(JNIEnv *env, jobject obj, jstring findLower, 2298db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins jstring findUpper, jboolean sameAsLastSearch) 22998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If one or the other is null, do not search. 23018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!(findLower && findUpper)) 23028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 23038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Obtain the characters for both the lower case string and the upper case 23048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // string representing the same word. 23058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const jchar* findLowerChars = env->GetStringChars(findLower, 0); 23068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const jchar* findUpperChars = env->GetStringChars(findUpper, 0); 23078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If one or the other is null, do not search. 23088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!(findLowerChars && findUpperChars)) { 23098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (findLowerChars) 23108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project env->ReleaseStringChars(findLower, findLowerChars); 23118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (findUpperChars) 23128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project env->ReleaseStringChars(findUpper, findUpperChars); 23138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 23148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 23158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 23178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in nativeFindAll"); 231846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark CachedRoot* root = view->getFrameCache(WebView::AllowNewer); 23198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!root) { 23208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project env->ReleaseStringChars(findLower, findLowerChars); 23218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project env->ReleaseStringChars(findUpper, findUpperChars); 23228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 23238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 23248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int length = env->GetStringLength(findLower); 23268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If the lengths of the strings do not match, then they are not the same 23278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // word, so do not search. 23288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!length || env->GetStringLength(findUpper) != length) { 23298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project env->ReleaseStringChars(findLower, findLowerChars); 23308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project env->ReleaseStringChars(findUpper, findUpperChars); 23318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 23328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 23338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int width = root->documentWidth(); 23358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int height = root->documentHeight(); 23368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Create a FindCanvas, which allows us to fake draw into it so we can 23378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // figure out where our search string is rendered (and how many times). 23388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FindCanvas canvas(width, height, (const UChar*) findLowerChars, 23398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (const UChar*) findUpperChars, length << 1); 23408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SkBitmap bitmap; 23418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bitmap.setConfig(SkBitmap::kARGB_8888_Config, width, height); 23428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project canvas.setBitmapDevice(bitmap); 2343f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark root->draw(canvas); 23448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WTF::Vector<MatchInfo>* matches = canvas.detachMatches(); 23458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // With setMatches, the WebView takes ownership of matches 2346db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins view->setMatches(matches, sameAsLastSearch); 23478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project env->ReleaseStringChars(findLower, findLowerChars); 23498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project env->ReleaseStringChars(findUpper, findUpperChars); 23508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 23518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return canvas.found(); 23528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeFindNext(JNIEnv *env, jobject obj, bool forward) 23558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 23578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in nativeFindNext"); 23588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view->findNext(forward); 23598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2361afbc0998ef990403a8e17efb9a384a46707a328eLeon Scrogginsstatic int nativeFindIndex(JNIEnv *env, jobject obj) 2362afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins{ 2363afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins WebView* view = GET_NATIVE_VIEW(env, obj); 2364afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins LOG_ASSERT(view, "view not set in nativeFindIndex"); 2365afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins return view->currentMatchIndex(); 2366afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins} 2367afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins 23688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeUpdateCachedTextfield(JNIEnv *env, jobject obj, jstring updatedText, jint generation) 23698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 23718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in nativeUpdateCachedTextfield"); 23728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer); 23738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!root) 23748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 23758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const CachedNode* cachedFocusNode = root->currentFocus(); 23761d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark if (!cachedFocusNode || !cachedFocusNode->isTextInput()) 23778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 237827dd31673790eed64c3e0e508bb900671f06bcb3Steve Block WTF::String webcoreString = jstringToWtfString(env, updatedText); 23798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (const_cast<CachedNode*>(cachedFocusNode))->setExport(webcoreString); 23808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project root->setTextGeneration(generation); 23818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 23828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2384fa768f11d82c34980cce020f442329299efb08caCary Clarkstatic jint nativeGetBlockLeftEdge(JNIEnv *env, jobject obj, jint x, jint y, 2385fa768f11d82c34980cce020f442329299efb08caCary Clark jfloat scale) 2386a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba{ 2387a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba WebView* view = GET_NATIVE_VIEW(env, obj); 2388a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 2389a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba if (!view) 2390a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba return -1; 2391fa768f11d82c34980cce020f442329299efb08caCary Clark return view->getBlockLeftEdge(x, y, scale); 2392a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba} 2393a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba 23948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeDestroy(JNIEnv *env, jobject obj) 23958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 23978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOGD("nativeDestroy view: %p", view); 23988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in nativeDestroy"); 23998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete view; 24008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24028360bc9c9facd690e42379610cbbb368d3d705efCary Clarkstatic void nativeStopGL(JNIEnv *env, jobject obj) 24038360bc9c9facd690e42379610cbbb368d3d705efCary Clark{ 24048360bc9c9facd690e42379610cbbb368d3d705efCary Clark GET_NATIVE_VIEW(env, obj)->stopGL(); 24058360bc9c9facd690e42379610cbbb368d3d705efCary Clark} 24068360bc9c9facd690e42379610cbbb368d3d705efCary Clark 24078480ea3097f295aeccf7c088a06cceea543238b7Leon Scrogginsstatic bool nativeMoveCursorToNextTextInput(JNIEnv *env, jobject obj) 2408e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins{ 2409e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins WebView* view = GET_NATIVE_VIEW(env, obj); 2410e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer); 2411e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins if (!root) 24128480ea3097f295aeccf7c088a06cceea543238b7Leon Scroggins return false; 241365966ae193adfef8d40419ad9c11515b0e56f257Cary Clark const CachedNode* current = root->currentCursor(); 241465966ae193adfef8d40419ad9c11515b0e56f257Cary Clark if (!current || !current->isTextInput()) 241565966ae193adfef8d40419ad9c11515b0e56f257Cary Clark current = root->currentFocus(); 241665966ae193adfef8d40419ad9c11515b0e56f257Cary Clark if (!current || !current->isTextInput()) 24178480ea3097f295aeccf7c088a06cceea543238b7Leon Scroggins return false; 2418e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins const CachedFrame* frame; 241965966ae193adfef8d40419ad9c11515b0e56f257Cary Clark const CachedNode* next = root->nextTextField(current, &frame); 2420e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins if (!next) 24218480ea3097f295aeccf7c088a06cceea543238b7Leon Scroggins return false; 2422f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const WebCore::IntRect& bounds = next->bounds(frame); 2423b0c9a2b4033eca931163e8223d7eaa8889337144Patrick Scott root->rootHistory()->setMouseBounds(bounds); 242487962ce00229855c098ba12cee8d5c015a835289Cary Clark view->getWebViewCore()->updateCursorBounds(root, frame, next); 242532dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark view->showCursorUntimed(); 2426e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins root->setCursor(const_cast<CachedFrame*>(frame), 2427e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins const_cast<CachedNode*>(next)); 2428bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins view->sendMoveFocus(static_cast<WebCore::Frame*>(frame->framePointer()), 2429bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins static_cast<WebCore::Node*>(next->nodePointer())); 24305065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark if (!next->isInLayer()) 24315065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark view->scrollRectOnScreen(bounds); 2432f74580c1504dcdd43fd15995b0e137982512dba2Leon Scroggins view->getWebViewCore()->m_moveGeneration++; 24338480ea3097f295aeccf7c088a06cceea543238b7Leon Scroggins return true; 2434e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins} 2435e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins 243646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic int nativeMoveGeneration(JNIEnv *env, jobject obj) 243746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 243836747fa778285f57f2f53c047028be83e9d8776dCary Clark WebView* view = GET_NATIVE_VIEW(env, obj); 243936747fa778285f57f2f53c047028be83e9d8776dCary Clark if (!view) 244036747fa778285f57f2f53c047028be83e9d8776dCary Clark return 0; 2441b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark return view->moveGeneration(); 244246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 244346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 2444a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeMoveSelection(JNIEnv *env, jobject obj, int x, int y) 24458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2446a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark GET_NATIVE_VIEW(env, obj)->moveSelection(x, y); 2447a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 2448a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 2449a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeResetSelection(JNIEnv *env, jobject obj) 2450a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 2451a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark return GET_NATIVE_VIEW(env, obj)->resetSelection(); 2452a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 2453a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 2454515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clarkstatic jobject nativeSelectableText(JNIEnv* env, jobject obj) 2455515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark{ 2456515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark IntPoint pos = GET_NATIVE_VIEW(env, obj)->selectableText(); 2457515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark jclass pointClass = env->FindClass("android/graphics/Point"); 2458515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark jmethodID init = env->GetMethodID(pointClass, "<init>", "(II)V"); 2459515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark jobject point = env->NewObject(pointClass, init, pos.x(), pos.y()); 2460515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark env->DeleteLocalRef(pointClass); 2461515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark return point; 2462515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark} 2463515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark 2464a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeSelectAll(JNIEnv* env, jobject obj) 2465a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 2466a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark GET_NATIVE_VIEW(env, obj)->selectAll(); 2467a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 2468a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 2469a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeSetExtendSelection(JNIEnv *env, jobject obj) 2470a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 2471a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark GET_NATIVE_VIEW(env, obj)->setExtendSelection(); 2472a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 2473a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 2474a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic jboolean nativeStartSelection(JNIEnv *env, jobject obj, int x, int y) 2475a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 2476a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark return GET_NATIVE_VIEW(env, obj)->startSelection(x, y); 2477a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 2478a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 2479a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic jboolean nativeWordSelection(JNIEnv *env, jobject obj, int x, int y) 2480a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 2481a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark return GET_NATIVE_VIEW(env, obj)->wordSelection(x, y); 2482a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 2483a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 2484a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeExtendSelection(JNIEnv *env, jobject obj, int x, int y) 2485a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 2486a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark GET_NATIVE_VIEW(env, obj)->extendSelection(x, y); 24878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jobject nativeGetSelection(JNIEnv *env, jobject obj) 24908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 24918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 24928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 24935e5962825729a211e093fd615ddc9e5b0bec10bdCary Clark String selection = view->getSelection(); 249479b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block return wtfStringToJstring(env, selection); 24958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2497a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic jboolean nativeHitSelection(JNIEnv *env, jobject obj, int x, int y) 2498a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 2499a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark return GET_NATIVE_VIEW(env, obj)->hitSelection(x, y); 2500a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 2501a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 2502a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic jint nativeSelectionX(JNIEnv *env, jobject obj) 250387962ce00229855c098ba12cee8d5c015a835289Cary Clark{ 2504a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark return GET_NATIVE_VIEW(env, obj)->selectionX(); 250587962ce00229855c098ba12cee8d5c015a835289Cary Clark} 250687962ce00229855c098ba12cee8d5c015a835289Cary Clark 2507a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic jint nativeSelectionY(JNIEnv *env, jobject obj) 2508a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 2509a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark return GET_NATIVE_VIEW(env, obj)->selectionY(); 2510a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 2511a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 2512223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reckstatic void nativeSetSelectionPointer(JNIEnv *env, jobject obj, jint nativeView, 2513223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck jboolean set, jfloat scale, jint x, jint y) 251487962ce00229855c098ba12cee8d5c015a835289Cary Clark{ 2515223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck ((WebView*)nativeView)->setSelectionPointer(set, scale, x, y); 251687962ce00229855c098ba12cee8d5c015a835289Cary Clark} 251787962ce00229855c098ba12cee8d5c015a835289Cary Clark 2518af33356e96e56310c66b47b6db913e1a61981ca3Chris Craikstatic void nativeRegisterPageSwapCallback(JNIEnv *env, jobject obj) 2519af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik{ 2520af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik GET_NATIVE_VIEW(env, obj)->registerPageSwapCallback(); 2521af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik} 2522af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik 25235dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic void nativeTileProfilingStart(JNIEnv *env, jobject obj) 25245dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{ 2525687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik TilesManager::instance()->getProfiler()->start(); 25265dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik} 25275dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik 25285dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic float nativeTileProfilingStop(JNIEnv *env, jobject obj) 25295dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{ 2530687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return TilesManager::instance()->getProfiler()->stop(); 25315dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik} 25325dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik 25335dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic void nativeTileProfilingClear(JNIEnv *env, jobject obj) 25345dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{ 2535687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik TilesManager::instance()->getProfiler()->clear(); 25365dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik} 25375dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik 25385dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic int nativeTileProfilingNumFrames(JNIEnv *env, jobject obj) 25395dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{ 2540687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return TilesManager::instance()->getProfiler()->numFrames(); 25415dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik} 25425dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik 25435dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic int nativeTileProfilingNumTilesInFrame(JNIEnv *env, jobject obj, int frame) 25445dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{ 2545687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return TilesManager::instance()->getProfiler()->numTilesInFrame(frame); 25465dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik} 25475dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik 2548687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craikstatic int nativeTileProfilingGetInt(JNIEnv *env, jobject obj, int frame, int tile, jstring jkey) 25495dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{ 2550687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik WTF::String key = jstringToWtfString(env, jkey); 2551687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik TileProfileRecord* record = TilesManager::instance()->getProfiler()->getTile(frame, tile); 2552687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik 2553687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik if (key == "left") 2554687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return record->left; 2555687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik if (key == "top") 2556687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return record->top; 2557687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik if (key == "right") 2558687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return record->right; 2559687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik if (key == "bottom") 2560687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return record->bottom; 2561687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik if (key == "level") 2562687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return record->level; 2563687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik if (key == "isReady") 2564687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return record->isReady ? 1 : 0; 2565687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return -1; 25665dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik} 25675dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik 2568687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craikstatic float nativeTileProfilingGetFloat(JNIEnv *env, jobject obj, int frame, int tile, jstring jkey) 25695dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{ 2570687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik TileProfileRecord* record = TilesManager::instance()->getProfiler()->getTile(frame, tile); 2571687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return record->scale; 25725dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik} 25735dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik 25748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_DUMP_DISPLAY_TREE 25758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void dumpToFile(const char text[], void* file) { 25768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fwrite(text, 1, strlen(text), reinterpret_cast<FILE*>(file)); 25778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fwrite("\n", 1, 1, reinterpret_cast<FILE*>(file)); 25788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 25808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2581f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roardstatic bool nativeSetProperty(JNIEnv *env, jobject obj, jstring jkey, jstring jvalue) 2582d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck{ 2583d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck WTF::String key = jstringToWtfString(env, jkey); 2584d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck WTF::String value = jstringToWtfString(env, jvalue); 2585ef238925ea0ba6305e4540aff5c6953503993f3bNicolas Roard if (key == "inverted") { 2586d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck if (value == "true") 2587d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck TilesManager::instance()->setInvertedScreen(true); 2588d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck else 2589d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck TilesManager::instance()->setInvertedScreen(false); 2590f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard return true; 2591d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck } 25928852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu else if (key == "inverted_contrast") { 2593bbb9caa2571e2c0192861a336c358412e9e7f0c7Nicolas Roard float contrast = value.toFloat(); 2594bbb9caa2571e2c0192861a336c358412e9e7f0c7Nicolas Roard TilesManager::instance()->setInvertedScreenContrast(contrast); 2595f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard return true; 2596bbb9caa2571e2c0192861a336c358412e9e7f0c7Nicolas Roard } 25978852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu else if (key == "enable_cpu_upload_path") { 25980960fe0e966317c4728542e9cfaa259523665900Teng-Hui Zhu TilesManager::instance()->transferQueue()->setTextureUploadType( 25990960fe0e966317c4728542e9cfaa259523665900Teng-Hui Zhu value == "true" ? CpuUpload : GpuUpload); 26000960fe0e966317c4728542e9cfaa259523665900Teng-Hui Zhu return true; 26010960fe0e966317c4728542e9cfaa259523665900Teng-Hui Zhu } 26028852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu else if (key == "use_minimal_memory") { 26038852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu TilesManager::instance()->setUseMinimalMemory(value == "true"); 26048852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu return true; 26058852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu } 2606f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard return false; 2607d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck} 2608d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck 2609d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reckstatic jstring nativeGetProperty(JNIEnv *env, jobject obj, jstring key) 2610d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck{ 2611d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck return 0; 2612d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck} 2613d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck 261452f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reckstatic void nativeOnTrimMemory(JNIEnv *env, jobject obj, jint level) 261552f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck{ 26162986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik if (TilesManager::hardwareAccelerationEnabled()) { 26172986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik bool freeAllTextures = (level > TRIM_MEMORY_UI_HIDDEN); 26182986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik TilesManager::instance()->deallocateTextures(freeAllTextures); 26192986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik } 262052f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck} 262152f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck 26228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeDumpDisplayTree(JNIEnv* env, jobject jwebview, jstring jurl) 26238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 26248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_DUMP_DISPLAY_TREE 26258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, jwebview); 26268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 26278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2628bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed if (view && view->getWebViewCore()) { 2629bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed FILE* file = fopen(DISPLAY_TREE_LOG_FILE, "w"); 2630bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed if (file) { 2631bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed SkFormatDumper dumper(dumpToFile, file); 2632bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed // dump the URL 2633bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed if (jurl) { 2634bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed const char* str = env->GetStringUTFChars(jurl, 0); 2635bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed SkDebugf("Dumping %s to %s\n", str, DISPLAY_TREE_LOG_FILE); 2636bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed dumpToFile(str, file); 2637bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed env->ReleaseStringUTFChars(jurl, str); 26388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2639bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed // now dump the display tree 2640bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed SkDumpCanvas canvas(&dumper); 2641bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed // this will playback the picture into the canvas, which will 2642bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed // spew its contents to the dumper 26436d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba view->draw(&canvas, 0, 0, false); 2644bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed // we're done with the file now 2645bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed fwrite("\n", 1, 1, file); 2646bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed fclose(file); 26478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2648859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard#if USE(ACCELERATED_COMPOSITING) 26496d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba const LayerAndroid* rootLayer = view->compositeRoot(); 2650f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark if (rootLayer) { 2651859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard FILE* file = fopen(LAYERS_TREE_LOG_FILE,"w"); 2652859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard if (file) { 2653859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard rootLayer->dumpLayers(file, 0); 2654859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard fclose(file); 2655859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard } 2656859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard } 2657859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard#endif 26588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 26598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 26608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 26618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2662f81c672a4f5c06621000a6df0984cde689397d94Cary Clarkstatic int nativeScrollableLayer(JNIEnv* env, jobject jwebview, jint x, jint y, 2663f81c672a4f5c06621000a6df0984cde689397d94Cary Clark jobject rect, jobject bounds) 2664a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{ 2665a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott WebView* view = GET_NATIVE_VIEW(env, jwebview); 2666a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 2667f81c672a4f5c06621000a6df0984cde689397d94Cary Clark SkIRect nativeRect, nativeBounds; 2668f81c672a4f5c06621000a6df0984cde689397d94Cary Clark int id = view->scrollableLayer(x, y, &nativeRect, &nativeBounds); 2669f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins if (rect) 2670f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins GraphicsJNI::irect_to_jrect(nativeRect, env, rect); 2671f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins if (bounds) 2672f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins GraphicsJNI::irect_to_jrect(nativeBounds, env, bounds); 267322e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott return id; 2674a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott} 2675a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott 267622e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scottstatic bool nativeScrollLayer(JNIEnv* env, jobject obj, jint layerId, jint x, 267722e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott jint y) 2678a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{ 2679a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL) 2680a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott WebView* view = GET_NATIVE_VIEW(env, obj); 268170adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik view->scrollLayer(layerId, x, y); 268270adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik 268370adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik //TODO: the below only needed for the SW rendering path 26848598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott LayerAndroid* root = view->compositeRoot(); 26858598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott if (!root) 26868598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott return false; 26878598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott LayerAndroid* layer = root->findById(layerId); 2688fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott if (!layer || !layer->contentIsScrollable()) 2689a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott return false; 2690fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott return static_cast<ScrollableLayerAndroid*>(layer)->scrollTo(x, y); 2691a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#endif 2692a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott return false; 2693a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott} 2694a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott 2695f51a51f6ea307f4311a04aa865a42b233269540bChris Craikstatic void nativeSetIsScrolling(JNIEnv* env, jobject jwebview, jboolean isScrolling) 2696f51a51f6ea307f4311a04aa865a42b233269540bChris Craik{ 2697f51a51f6ea307f4311a04aa865a42b233269540bChris Craik WebView* view = GET_NATIVE_VIEW(env, jwebview); 2698f51a51f6ea307f4311a04aa865a42b233269540bChris Craik LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 2699f51a51f6ea307f4311a04aa865a42b233269540bChris Craik view->setIsScrolling(isScrolling); 2700f51a51f6ea307f4311a04aa865a42b233269540bChris Craik} 2701f51a51f6ea307f4311a04aa865a42b233269540bChris Craik 2702c7e578330aece3c556ef205365c24676687223e2Derek Sollenbergerstatic void nativeUseHardwareAccelSkia(JNIEnv*, jobject, jboolean enabled) 2703c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger{ 2704c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger BaseRenderer::setCurrentRendererType(enabled ? BaseRenderer::Ganesh : BaseRenderer::Raster); 2705c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger} 2706c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger 27075e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reckstatic int nativeGetBackgroundColor(JNIEnv* env, jobject obj) 27085e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck{ 27095e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck WebView* view = GET_NATIVE_VIEW(env, obj); 27105e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck BaseLayerAndroid* baseLayer = view->getBaseLayer(); 27115e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck if (baseLayer) { 27125e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck WebCore::Color color = baseLayer->getBackgroundColor(); 27135e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck if (color.isValid()) 27145e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck return SkColorSetARGB(color.alpha(), color.red(), 27155e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck color.green(), color.blue()); 27165e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck } 27175e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck return SK_ColorWHITE; 27185e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck} 27195e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck 2720d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reckstatic void nativeSetPauseDrawing(JNIEnv *env, jobject obj, jint nativeView, 2721d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck jboolean pause) 2722d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck{ 2723d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck ((WebView*)nativeView)->m_isDrawingPaused = pause; 2724d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck} 2725d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck 27268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 27278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * JNI registration 27288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 27298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic JNINativeMethod gJavaWebViewMethods[] = { 2730d4924af12855cd19162ba1442a6055664c98ca32Cary Clark { "nativeCacheHitFramePointer", "()I", 2731d4924af12855cd19162ba1442a6055664c98ca32Cary Clark (void*) nativeCacheHitFramePointer }, 2732b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark { "nativeCacheHitIsPlugin", "()Z", 2733b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark (void*) nativeCacheHitIsPlugin }, 2734d4924af12855cd19162ba1442a6055664c98ca32Cary Clark { "nativeCacheHitNodeBounds", "()Landroid/graphics/Rect;", 2735d4924af12855cd19162ba1442a6055664c98ca32Cary Clark (void*) nativeCacheHitNodeBounds }, 2736d4924af12855cd19162ba1442a6055664c98ca32Cary Clark { "nativeCacheHitNodePointer", "()I", 2737d4924af12855cd19162ba1442a6055664c98ca32Cary Clark (void*) nativeCacheHitNodePointer }, 2738c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark { "nativeClearCursor", "()V", 2739bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins (void*) nativeClearCursor }, 274055b4bdbd661ac94fd05ab40de08250bf242d5346John Reck { "nativeCreate", "(ILjava/lang/String;Z)V", 27418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (void*) nativeCreate }, 274246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeCursorFramePointer", "()I", 274346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeCursorFramePointer }, 27441cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins { "nativePageShouldHandleShiftAndArrows", "()Z", 27451cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins (void*) nativePageShouldHandleShiftAndArrows }, 274646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeCursorNodeBounds", "()Landroid/graphics/Rect;", 274746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeCursorNodeBounds }, 274846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeCursorNodePointer", "()I", 274946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeCursorNodePointer }, 275046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeCursorIntersects", "(Landroid/graphics/Rect;)Z", 275146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeCursorIntersects }, 275246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeCursorIsAnchor", "()Z", 275346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeCursorIsAnchor }, 275446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeCursorIsTextInput", "()Z", 275546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeCursorIsTextInput }, 275636747fa778285f57f2f53c047028be83e9d8776dCary Clark { "nativeCursorPosition", "()Landroid/graphics/Point;", 275736747fa778285f57f2f53c047028be83e9d8776dCary Clark (void*) nativeCursorPosition }, 275846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeCursorText", "()Ljava/lang/String;", 275946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeCursorText }, 2760f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark { "nativeCursorWantsKeyEvents", "()Z", 2761f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark (void*)nativeCursorWantsKeyEvents }, 27628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { "nativeDebugDump", "()V", 27638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (void*) nativeDebugDump }, 27648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { "nativeDestroy", "()V", 27658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (void*) nativeDestroy }, 2766a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount { "nativeDraw", "(Landroid/graphics/Canvas;Landroid/graphics/RectF;IIZ)I", 27676d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba (void*) nativeDraw }, 2768a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount { "nativeGetDrawGLFunction", "(ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/RectF;FI)I", 2769908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase (void*) nativeGetDrawGLFunction }, 2770a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount { "nativeUpdateDrawGLFunction", "(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/RectF;)V", 2771908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase (void*) nativeUpdateDrawGLFunction }, 277246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeDumpDisplayTree", "(Ljava/lang/String;)V", 277346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeDumpDisplayTree }, 2774223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck { "nativeEvaluateLayersAnimations", "(I)Z", 277587962ce00229855c098ba12cee8d5c015a835289Cary Clark (void*) nativeEvaluateLayersAnimations }, 2776a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark { "nativeExtendSelection", "(II)V", 2777a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark (void*) nativeExtendSelection }, 2778db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins { "nativeFindAll", "(Ljava/lang/String;Ljava/lang/String;Z)I", 277946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeFindAll }, 278046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeFindNext", "(Z)V", 278146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeFindNext }, 2782afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins { "nativeFindIndex", "()I", 2783afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins (void*) nativeFindIndex}, 278449e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark { "nativeFocusCandidateFramePointer", "()I", 278549e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark (void*) nativeFocusCandidateFramePointer }, 27862194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins { "nativeFocusCandidateHasNextTextfield", "()Z", 27872194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins (void*) focusCandidateHasNextTextfield }, 2788bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins { "nativeFocusCandidateIsPassword", "()Z", 2789bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins (void*) nativeFocusCandidateIsPassword }, 2790bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins { "nativeFocusCandidateIsRtlText", "()Z", 2791bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins (void*) nativeFocusCandidateIsRtlText }, 2792bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins { "nativeFocusCandidateIsTextInput", "()Z", 2793bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins (void*) nativeFocusCandidateIsTextInput }, 2794d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins { "nativeFocusCandidateLineHeight", "()I", 2795d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins (void*) nativeFocusCandidateLineHeight }, 2796bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins { "nativeFocusCandidateMaxLength", "()I", 2797bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins (void*) nativeFocusCandidateMaxLength }, 2798ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins { "nativeFocusCandidateIsAutoComplete", "()Z", 2799ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins (void*) nativeFocusCandidateIsAutoComplete }, 280085e3844824444f304a15e57f62d2e5670fb3bf47Michael Kolb { "nativeFocusCandidateIsSpellcheck", "()Z", 280185e3844824444f304a15e57f62d2e5670fb3bf47Michael Kolb (void*) nativeFocusCandidateIsSpellcheck }, 2802bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins { "nativeFocusCandidateName", "()Ljava/lang/String;", 2803bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins (void*) nativeFocusCandidateName }, 2804bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins { "nativeFocusCandidateNodeBounds", "()Landroid/graphics/Rect;", 2805bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins (void*) nativeFocusCandidateNodeBounds }, 2806390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins { "nativeFocusCandidatePaddingRect", "()Landroid/graphics/Rect;", 2807390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins (void*) nativeFocusCandidatePaddingRect }, 2808bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins { "nativeFocusCandidatePointer", "()I", 2809bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins (void*) nativeFocusCandidatePointer }, 2810bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins { "nativeFocusCandidateText", "()Ljava/lang/String;", 2811bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins (void*) nativeFocusCandidateText }, 28123a3b28707d2d6a06afe9f3137e9bedc07246d600Leon Scroggins { "nativeFocusCandidateTextSize", "()F", 2813bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins (void*) nativeFocusCandidateTextSize }, 281474757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins { "nativeFocusCandidateType", "()I", 281574757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins (void*) nativeFocusCandidateType }, 2816d635c32628b7d9760bf786613cbe3eddf98a1272Michael Kolb { "nativeFocusCandidateLayerId", "()I", 2817d635c32628b7d9760bf786613cbe3eddf98a1272Michael Kolb (void*) nativeFocusCandidateLayerId }, 2818c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger { "nativeFocusIsPlugin", "()Z", 2819c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger (void*) nativeFocusIsPlugin }, 28208026280044128436d8e89736519a0b32b6540201Cary Clark { "nativeFocusNodeBounds", "()Landroid/graphics/Rect;", 28218026280044128436d8e89736519a0b32b6540201Cary Clark (void*) nativeFocusNodeBounds }, 2822539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins { "nativeFocusNodePointer", "()I", 2823539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins (void*) nativeFocusNodePointer }, 282446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeGetCursorRingBounds", "()Landroid/graphics/Rect;", 282546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeGetCursorRingBounds }, 28265e5962825729a211e093fd615ddc9e5b0bec10bdCary Clark { "nativeGetSelection", "()Ljava/lang/String;", 282746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeGetSelection }, 282846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeHasCursorNode", "()Z", 282946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeHasCursorNode }, 283046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeHasFocusNode", "()Z", 283146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeHasFocusNode }, 2832c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark { "nativeHideCursor", "()V", 2833c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark (void*) nativeHideCursor }, 2834a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark { "nativeHitSelection", "(II)Z", 2835a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark (void*) nativeHitSelection }, 283646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeImageURI", "(II)Ljava/lang/String;", 283746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeImageURI }, 28388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { "nativeInstrumentReport", "()V", 28398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (void*) nativeInstrumentReport }, 28409092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark { "nativeLayerBounds", "(I)Landroid/graphics/Rect;", 28419092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark (void*) nativeLayerBounds }, 2842d48434fc633d173b549b97b1c614072adc9648a8Cary Clark { "nativeMotionUp", "(III)Z", 28438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (void*) nativeMotionUp }, 2844bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins { "nativeMoveCursor", "(IIZ)Z", 2845bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins (void*) nativeMoveCursor }, 28468480ea3097f295aeccf7c088a06cceea543238b7Leon Scroggins { "nativeMoveCursorToNextTextInput", "()Z", 2847e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins (void*) nativeMoveCursorToNextTextInput }, 284846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeMoveGeneration", "()I", 284946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeMoveGeneration }, 2850a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark { "nativeMoveSelection", "(II)V", 285146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeMoveSelection }, 2852d4924af12855cd19162ba1442a6055664c98ca32Cary Clark { "nativePointInNavCache", "(III)Z", 2853d4924af12855cd19162ba1442a6055664c98ca32Cary Clark (void*) nativePointInNavCache }, 2854a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark { "nativeResetSelection", "()V", 2855a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark (void*) nativeResetSelection }, 2856515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark { "nativeSelectableText", "()Landroid/graphics/Point;", 2857515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark (void*) nativeSelectableText }, 2858a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark { "nativeSelectAll", "()V", 2859a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark (void*) nativeSelectAll }, 28608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { "nativeSelectBestAt", "(Landroid/graphics/Rect;)V", 28618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (void*) nativeSelectBestAt }, 28621b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov { "nativeSelectAt", "(II)V", 28631b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov (void*) nativeSelectAt }, 2864a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark { "nativeSelectionX", "()I", 2865a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark (void*) nativeSelectionX }, 2866a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark { "nativeSelectionY", "()I", 2867a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark (void*) nativeSelectionY }, 2868a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark { "nativeSetExtendSelection", "()V", 2869a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark (void*) nativeSetExtendSelection }, 2870afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark { "nativeSetFindIsEmpty", "()V", 2871afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark (void*) nativeSetFindIsEmpty }, 2872afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark { "nativeSetFindIsUp", "(Z)V", 2873d74d4ceff106be90d9eaf08ec191a96bd87a7007Cary Clark (void*) nativeSetFindIsUp }, 28748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { "nativeSetHeightCanMeasure", "(Z)V", 28758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (void*) nativeSetHeightCanMeasure }, 287696eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik { "nativeSetBaseLayer", "(ILandroid/graphics/Region;ZZZ)V", 28776d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba (void*) nativeSetBaseLayer }, 2878e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck { "nativeGetTextSelectionRegion", "(ILandroid/graphics/Region;)V", 28798111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck (void*) nativeGetTextSelectionRegion }, 2880e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck { "nativeGetSelectionHandles", "(I[I)V", 2881e94313e95fb5e08870a58c7a4b593da08cc3d424John Reck (void*) nativeGetSelectionHandles }, 28824212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck { "nativeGetBaseLayer", "()I", 28834212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck (void*) nativeGetBaseLayer }, 28846d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba { "nativeReplaceBaseContent", "(I)V", 28856d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba (void*) nativeReplaceBaseContent }, 28866d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba { "nativeCopyBaseContentToPicture", "(Landroid/graphics/Picture;)V", 28876d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba (void*) nativeCopyBaseContentToPicture }, 28886d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba { "nativeHasContent", "()Z", 28896d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba (void*) nativeHasContent }, 2890223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck { "nativeSetSelectionPointer", "(IZFII)V", 289187962ce00229855c098ba12cee8d5c015a835289Cary Clark (void*) nativeSetSelectionPointer }, 289232dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark { "nativeShowCursorTimed", "()V", 289332dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark (void*) nativeShowCursorTimed }, 2894af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik { "nativeRegisterPageSwapCallback", "()V", 2895af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik (void*) nativeRegisterPageSwapCallback }, 28965dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik { "nativeTileProfilingStart", "()V", 28975dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik (void*) nativeTileProfilingStart }, 28985dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik { "nativeTileProfilingStop", "()F", 28995dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik (void*) nativeTileProfilingStop }, 29005dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik { "nativeTileProfilingClear", "()V", 29015dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik (void*) nativeTileProfilingClear }, 29025dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik { "nativeTileProfilingNumFrames", "()I", 29035dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik (void*) nativeTileProfilingNumFrames }, 29045dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik { "nativeTileProfilingNumTilesInFrame", "(I)I", 29055dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik (void*) nativeTileProfilingNumTilesInFrame }, 2906687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik { "nativeTileProfilingGetInt", "(IILjava/lang/String;)I", 2907687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik (void*) nativeTileProfilingGetInt }, 2908687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik { "nativeTileProfilingGetFloat", "(IILjava/lang/String;)F", 2909687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik (void*) nativeTileProfilingGetFloat }, 2910a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark { "nativeStartSelection", "(II)Z", 2911a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark (void*) nativeStartSelection }, 29128360bc9c9facd690e42379610cbbb368d3d705efCary Clark { "nativeStopGL", "()V", 29138360bc9c9facd690e42379610cbbb368d3d705efCary Clark (void*) nativeStopGL }, 2914cc4e3c422964c7d999e8f340057f303140d845ddCary Clark { "nativeSubtractLayers", "(Landroid/graphics/Rect;)Landroid/graphics/Rect;", 2915cc4e3c422964c7d999e8f340057f303140d845ddCary Clark (void*) nativeSubtractLayers }, 291646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeTextGeneration", "()I", 291746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeTextGeneration }, 29188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { "nativeUpdateCachedTextfield", "(Ljava/lang/String;I)V", 2919b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark (void*) nativeUpdateCachedTextfield }, 2920a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark { "nativeWordSelection", "(II)Z", 2921a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark (void*) nativeWordSelection }, 2922fa768f11d82c34980cce020f442329299efb08caCary Clark { "nativeGetBlockLeftEdge", "(IIF)I", 2923a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba (void*) nativeGetBlockLeftEdge }, 2924f81c672a4f5c06621000a6df0984cde689397d94Cary Clark { "nativeScrollableLayer", "(IILandroid/graphics/Rect;Landroid/graphics/Rect;)I", 2925a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott (void*) nativeScrollableLayer }, 2926a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott { "nativeScrollLayer", "(III)Z", 2927a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott (void*) nativeScrollLayer }, 2928f51a51f6ea307f4311a04aa865a42b233269540bChris Craik { "nativeSetIsScrolling", "(Z)V", 2929f51a51f6ea307f4311a04aa865a42b233269540bChris Craik (void*) nativeSetIsScrolling }, 2930c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger { "nativeUseHardwareAccelSkia", "(Z)V", 2931c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger (void*) nativeUseHardwareAccelSkia }, 29325e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck { "nativeGetBackgroundColor", "()I", 29335e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck (void*) nativeGetBackgroundColor }, 2934f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard { "nativeSetProperty", "(Ljava/lang/String;Ljava/lang/String;)Z", 2935d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck (void*) nativeSetProperty }, 2936d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck { "nativeGetProperty", "(Ljava/lang/String;)Ljava/lang/String;", 2937d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck (void*) nativeGetProperty }, 293852f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck { "nativeOnTrimMemory", "(I)V", 293952f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck (void*) nativeOnTrimMemory }, 2940d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck { "nativeSetPauseDrawing", "(IZ)V", 2941d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck (void*) nativeSetPauseDrawing }, 29428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 29438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2944b92850e0391d674b9c4826b66105aaa3dd3eef96Steve Blockint registerWebView(JNIEnv* env) 29458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 29468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jclass clazz = env->FindClass("android/webkit/WebView"); 29478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(clazz, "Unable to find class android/webkit/WebView"); 29488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project gWebViewField = env->GetFieldID(clazz, "mNativeClass", "I"); 29498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(gWebViewField, "Unable to find android/webkit/WebView.mNativeClass"); 2950bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block env->DeleteLocalRef(clazz); 29518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 29528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return jniRegisterNativeMethods(env, "android/webkit/WebView", gJavaWebViewMethods, NELEM(gJavaWebViewMethods)); 29538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 29548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 29558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace android 2956