WebView.cpp revision 0bab4025aed8786cb8307d2eede87f7f21cc0d65
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; 122ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard jmethodID m_calcOurContentVisibleRectF; 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_overrideLoading; 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_scrollBy; 125bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins jmethodID m_sendMoveFocus; 12646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark jmethodID m_sendMoveMouse; 12746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark jmethodID m_sendMoveMouseIfLatest; 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_sendMotionUp; 12995fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins jmethodID m_domChangedFocus; 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_getScaledMaxXScroll; 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_getScaledMaxYScroll; 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_getVisibleRect; 13394d36f098e1c65d69568e6fb00124c542e5c7f6fLeon Scroggins jmethodID m_rebuildWebTextView; 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_viewInvalidate; 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_viewInvalidateRect; 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_postInvalidateDelayed; 13796eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik jmethodID m_pageSwapCallback; 1383deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger jmethodID m_inFullScreenMode; 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jfieldID m_rectLeft; 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jfieldID m_rectTop; 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_rectWidth; 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_rectHeight; 143ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard jfieldID m_rectFLeft; 144ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard jfieldID m_rectFTop; 145ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard jmethodID m_rectFWidth; 146ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard jmethodID m_rectFHeight; 14762740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck jmethodID m_getTextHandleScale; 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project AutoJObject object(JNIEnv* env) { 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return getRealObject(env, m_obj); 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} m_javaGlue; 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 153ce03c1c1203621e552d41a8b3831837636f364a9Ben MurdochWebView(JNIEnv* env, jobject javaWebView, int viewImpl, WTF::String drawableDir) : 15487962ce00229855c098ba12cee8d5c015a835289Cary Clark m_ring((WebViewCore*) viewImpl) 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jclass clazz = env->FindClass("android/webkit/WebView"); 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // m_javaGlue = new JavaGlue; 1583bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott m_javaGlue.m_obj = env->NewWeakGlobalRef(javaWebView); 15951c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins m_javaGlue.m_scrollBy = GetJMethod(env, clazz, "setContentScrollBy", "(IIZ)Z"); 160ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard m_javaGlue.m_calcOurContentVisibleRectF = GetJMethod(env, clazz, "calcOurContentVisibleRectF", "(Landroid/graphics/RectF;)V"); 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"); 17596eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik m_javaGlue.m_pageSwapCallback = GetJMethod(env, clazz, "pageSwapCallback", "()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; 207ce03c1c1203621e552d41a8b3831837636f364a9Ben Murdoch m_buttonSkin = drawableDir.isEmpty() ? 0 : new RenderSkinButton(drawableDir); 208c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger#if USE(ACCELERATED_COMPOSITING) 209c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger m_glWebViewState = 0; 21096eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik m_pageSwapCallbackRegistered = false; 211c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger#endif 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project~WebView() 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_javaGlue.m_obj) 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 2193bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott env->DeleteWeakGlobalRef(m_javaGlue.m_obj); 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_javaGlue.m_obj = 0; 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 22275394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roard#if USE(ACCELERATED_COMPOSITING) 223c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger // We must remove the m_glWebViewState prior to deleting m_baseLayer. If we 224c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger // do not remove it here, we risk having BaseTiles trying to paint using a 225c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger // deallocated base layer. 2268360bc9c9facd690e42379610cbbb368d3d705efCary Clark stopGL(); 22775394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roard#endif 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete m_frameCacheUI; 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete m_navPictureUI; 230b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger SkSafeUnref(m_baseLayer); 231908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase delete m_glDrawFunctor; 2324de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins delete m_buttonSkin; 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2358360bc9c9facd690e42379610cbbb368d3d705efCary Clarkvoid stopGL() 2368360bc9c9facd690e42379610cbbb368d3d705efCary Clark{ 2378360bc9c9facd690e42379610cbbb368d3d705efCary Clark#if USE(ACCELERATED_COMPOSITING) 2388360bc9c9facd690e42379610cbbb368d3d705efCary Clark delete m_glWebViewState; 2398360bc9c9facd690e42379610cbbb368d3d705efCary Clark m_glWebViewState = 0; 2408360bc9c9facd690e42379610cbbb368d3d705efCary Clark#endif 2418360bc9c9facd690e42379610cbbb368d3d705efCary Clark} 2428360bc9c9facd690e42379610cbbb368d3d705efCary Clark 243bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike ReedWebViewCore* getWebViewCore() const { 244bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed return m_viewImpl; 245bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed} 246bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed 24762740ff35119cc54e82b6af582a01dd34b9e027eJohn Reckfloat getTextHandleScale() 24862740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck{ 24962740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!"); 25062740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck JNIEnv* env = JSC::Bindings::getJNIEnv(); 25162740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck AutoJObject javaObject = m_javaGlue.object(env); 25262740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck if (!javaObject.get()) 25362740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck return 0; 25462740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck float result = env->CallFloatMethod(javaObject.get(), m_javaGlue.m_getTextHandleScale); 25562740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck checkException(env); 25662740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck return result; 25762740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck} 25862740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck 25962740ff35119cc54e82b6af582a01dd34b9e027eJohn Reckvoid updateSelectionHandles() 26062740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck{ 26162740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck if (!m_baseLayer) 26262740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck return; 26362740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck // Adjust for device density & scale 26462740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck m_selectText.updateHandleScale(getTextHandleScale()); 26562740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck} 26662740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck 267c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark// removes the cursor altogether (e.g., when going to a new page) 268c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clarkvoid clearCursor() 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedRoot* root = getFrameCache(AllowNewer); 271c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark if (!root) 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 273c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark DBG_NAV_LOG(""); 27469bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins m_viewImpl->m_hasCursorBounds = false; 275c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark root->clearCursor(); 276c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark viewInvalidate(); 277c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark} 278c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark 279c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark// leaves the cursor where it is, but suppresses drawing it 280c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clarkvoid hideCursor() 281c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark{ 282c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark CachedRoot* root = getFrameCache(AllowNewer); 283c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark if (!root) 284c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark return; 285c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark DBG_NAV_LOG(""); 2860924a66d1664f53afd148456e5709c471ff7240aCary Clark hideCursor(root); 287b31c03a968a578cc43e606ede80cefcd07e8ee07John Reck viewInvalidate(); 2880924a66d1664f53afd148456e5709c471ff7240aCary Clark} 2890924a66d1664f53afd148456e5709c471ff7240aCary Clark 2900924a66d1664f53afd148456e5709c471ff7240aCary Clarkvoid hideCursor(CachedRoot* root) 2910924a66d1664f53afd148456e5709c471ff7240aCary Clark{ 2920924a66d1664f53afd148456e5709c471ff7240aCary Clark DBG_NAV_LOG("inner"); 29369bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins m_viewImpl->m_hasCursorBounds = false; 294c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark root->hideCursor(); 2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if DUMP_NAV_CACHE 2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid debugDump() 2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedRoot* root = getFrameCache(DontAllowNewer); 3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (root) 3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project root->mDebug.print(); 3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Traverse our stored array of buttons that are in our picture, and update 30746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark// their subpictures according to their current state. 3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Called from the UI thread. This is the one place in the UI thread where we 3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// access the buttons stored in the WebCore thread. 3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// hasFocus keeps track of whether the WebView has focus && windowFocus. 31146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark// If not, we do not want to draw the button in a selected or pressed state 3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid nativeRecordButtons(bool hasFocus, bool pressed, bool invalidate) 3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 31446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark bool cursorIsOnButton = false; 315f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedFrame* cachedFrame; 31646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark const CachedNode* cachedCursor = 0; 3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Lock the mutex, since we now share with the WebCore thread. 3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_viewImpl->gButtonMutex.lock(); 3194de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins if (m_viewImpl->m_buttons.size() && m_buttonSkin) { 32046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark // FIXME: In a future change, we should keep track of whether the selection 3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // has changed to short circuit (note that we would still need to update 3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // if we received new buttons from the WebCore thread). 32346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark WebCore::Node* cursor = 0; 3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedRoot* root = getFrameCache(DontAllowNewer); 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (root) { 326f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark cachedCursor = root->currentCursor(&cachedFrame); 32746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark if (cachedCursor) 32846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark cursor = (WebCore::Node*) cachedCursor->nodePointer(); 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Traverse the array, and update each button, depending on whether it 33246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark // is selected. 3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Container* end = m_viewImpl->m_buttons.end(); 3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Container* ptr = m_viewImpl->m_buttons.begin(); ptr != end; ptr++) { 335438cced0716e328ab5e424e35b377d2dd686f46bCary Clark RenderSkinAndroid::State state = RenderSkinAndroid::kNormal; 33646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark if (ptr->matches(cursor)) { 33746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark cursorIsOnButton = true; 3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If the WebView is out of focus/window focus, set the state to 33946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark // normal, but still keep track of the fact that the selected is a 3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // button 341438cced0716e328ab5e424e35b377d2dd686f46bCary Clark if (hasFocus) { 342438cced0716e328ab5e424e35b377d2dd686f46bCary Clark if (pressed || m_ring.m_isPressed) 343438cced0716e328ab5e424e35b377d2dd686f46bCary Clark state = RenderSkinAndroid::kPressed; 344cd8a18fcca4aaa5658aaf236b034516fccac7932Cary Clark else if (SkTime::GetMSecs() < m_ringAnimationEnd) 345438cced0716e328ab5e424e35b377d2dd686f46bCary Clark state = RenderSkinAndroid::kFocused; 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3484de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins ptr->updateFocusState(state, m_buttonSkin); 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_viewImpl->gButtonMutex.unlock(); 35246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark if (invalidate && cachedCursor && cursorIsOnButton) { 353f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const WebCore::IntRect& b = cachedCursor->bounds(cachedFrame); 3541ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block viewInvalidateRect(b.x(), b.y(), b.maxX(), b.maxY()); 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 358c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Blockvoid scrollToCurrentMatch() 359c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block{ 360c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block if (!m_findOnPage.currentMatchIsInLayer()) { 361c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block scrollRectOnScreen(m_findOnPage.currentMatchBounds()); 362c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block return; 363c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block } 364c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block 365c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block SkRect matchBounds = m_findOnPage.currentMatchBounds(); 3668782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block LayerAndroid* rootLayer = getFrameCache(DontAllowNewer)->rootLayer(); 3678782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block Layer* layerContainingMatch = rootLayer->findById(m_findOnPage.currentMatchLayerId()); 368c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block ASSERT(layerContainingMatch); 369c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block 3708782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // If the match is in a fixed position layer, there's nothing to do. 3718782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block if (layerContainingMatch->shouldInheritFromRootTransform()) 3728782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block return; 3738782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block 3748782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // If the match is in a scrollable layer or a descendant of such a layer, 3758782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // there may be a range of of scroll configurations that will make the 3768782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // current match visible. Our approach is the simplest possible. Starting at 3778782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // the layer in which the match is found, we move up the layer tree, 3788782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // scrolling any scrollable layers as little as possible to make sure that 3798782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // the current match is in view. This approach has the disadvantage that we 3808782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // may end up scrolling a larger number of elements than is necessary, which 3818782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // may be visually jarring. However, minimising the number of layers 3828782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // scrolled would complicate the code significantly. 3838782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block 3848782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block bool didScrollLayer = false; 3858782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block for (Layer* layer = layerContainingMatch; layer; layer = layer->getParent()) { 3868782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block ASSERT(layer->getParent() || layer == rootLayer); 3878782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block 3888782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block if (layer->contentIsScrollable()) { 3898782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // Convert the match location to layer's local space and scroll it. 3908782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // Repeatedly calling Layer::localToAncestor() is inefficient as 3918782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // each call repeats part of the calculation. It would be more 3928782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // efficient to maintain the transform here and update it on each 3938782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // iteration, but that would mean duplicating logic from 3948782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // Layer::localToAncestor() and would complicate things. 3958782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block SkMatrix transform; 3968782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block layerContainingMatch->localToAncestor(layer, &transform); 3978782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block SkRect transformedMatchBounds; 3988782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block transform.mapRect(&transformedMatchBounds, matchBounds); 3998782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block SkIRect roundedTransformedMatchBounds; 4008782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block transformedMatchBounds.roundOut(&roundedTransformedMatchBounds); 4018782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // Only ScrollableLayerAndroid returns true for contentIsScrollable(). 4028782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block didScrollLayer |= static_cast<ScrollableLayerAndroid*>(layer)->scrollRectIntoView(roundedTransformedMatchBounds); 4038782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block } 4048782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block } 4058782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block // Invalidate, as the call below to scroll the main page may be a no-op. 4068782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block if (didScrollLayer) 4078782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block viewInvalidate(); 408c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block 409c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block // Convert matchBounds to the global space so we can scroll the main page. 410c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block SkMatrix transform; 411c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block layerContainingMatch->localToGlobal(&transform); 412c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block SkRect transformedMatchBounds; 413c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block transform.mapRect(&transformedMatchBounds, matchBounds); 414c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block SkIRect roundedTransformedMatchBounds; 415c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block transformedMatchBounds.roundOut(&roundedTransformedMatchBounds); 416c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block scrollRectOnScreen(roundedTransformedMatchBounds); 417c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block} 418c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block 419afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clarkvoid scrollRectOnScreen(const IntRect& rect) 4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 421afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark if (rect.isEmpty()) 422afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark return; 423275d382a3335934e6edebdb9d07fe87b404cead4Kristian Monsen SkRect visible = SkRect::MakeEmpty(); 4245065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark calcOurContentVisibleRect(&visible); 4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int dx = 0; 426afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark int left = rect.x(); 4271ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block int right = rect.maxX(); 4285065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark if (left < visible.fLeft) { 4295065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark dx = left - visible.fLeft; 4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Only scroll right if the entire width can fit on screen. 4315065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark } else if (right > visible.fRight && right - left < visible.width()) { 4325065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark dx = right - visible.fRight; 4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int dy = 0; 435afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark int top = rect.y(); 4361ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block int bottom = rect.maxY(); 4375065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark if (top < visible.fTop) { 4385065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark dy = top - visible.fTop; 4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Only scroll down if the entire height can fit on screen 4405065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark } else if (bottom > visible.fBottom && bottom - top < visible.height()) { 4415065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark dy = bottom - visible.fBottom; 4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 44351c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins if ((dx|dy) == 0 || !scrollBy(dx, dy)) 444afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark return; 44551c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins viewInvalidate(); 446e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins} 447e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins 4485065a677456ac1cb630e5271e781b2aa796af7a5Cary Clarkvoid calcOurContentVisibleRect(SkRect* r) 4495065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark{ 4505065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark JNIEnv* env = JSC::Bindings::getJNIEnv(); 451b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 452b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 453b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return; 454ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard jclass rectClass = env->FindClass("android/graphics/RectF"); 455ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard jmethodID init = env->GetMethodID(rectClass, "<init>", "(FFFF)V"); 4565065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark jobject jRect = env->NewObject(rectClass, init, 0, 0, 0, 0); 457b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block env->CallVoidMethod(javaObject.get(), m_javaGlue.m_calcOurContentVisibleRectF, jRect); 458ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard r->fLeft = env->GetFloatField(jRect, m_javaGlue.m_rectFLeft); 459ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard r->fTop = env->GetFloatField(jRect, m_javaGlue.m_rectFTop); 460ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard r->fRight = r->fLeft + env->CallFloatMethod(jRect, m_javaGlue.m_rectFWidth); 461ccac38a6b48843126402088a309597e682f40fe6Nicolas Roard r->fBottom = r->fTop + env->CallFloatMethod(jRect, m_javaGlue.m_rectFHeight); 462bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block env->DeleteLocalRef(rectClass); 4635065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark env->DeleteLocalRef(jRect); 4645065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark checkException(env); 4655065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark} 4665065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark 467b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clarkvoid resetCursorRing() 468b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark{ 46932dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark m_ringAnimationEnd = 0; 470b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark m_viewImpl->m_hasCursorBounds = false; 471b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark} 472b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark 47387962ce00229855c098ba12cee8d5c015a835289Cary Clarkbool drawCursorPreamble(CachedRoot* root) 4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 475dfadaafc15c16563aba837f05c778eaa2a433a8bJohn Reck if (!root) return false; 476461c3fcad8dc54fa3240dcc0cb8989e690408578Cary Clark const CachedFrame* frame; 477461c3fcad8dc54fa3240dcc0cb8989e690408578Cary Clark const CachedNode* node = root->currentCursor(&frame); 4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!node) { 47949e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark DBG_NAV_LOGV("%s", "!node"); 480b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark resetCursorRing(); 48187962ce00229855c098ba12cee8d5c015a835289Cary Clark return false; 4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 483cd8a18fcca4aaa5658aaf236b034516fccac7932Cary Clark m_ring.setIsButton(node); 4843efa919a7f16fdb717e393f501c50d4844ffaed5Cary Clark if (node->isHidden()) { 4853efa919a7f16fdb717e393f501c50d4844ffaed5Cary Clark DBG_NAV_LOG("node->isHidden()"); 48646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark m_viewImpl->m_hasCursorBounds = false; 48787962ce00229855c098ba12cee8d5c015a835289Cary Clark return false; 4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 489d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark#if USE(ACCELERATED_COMPOSITING) 490ea684c4f21a0b23ce2ca839f4e9f978d2d02de25Teng-Hui Zhu if (node->isInLayer() && root->rootLayer()) { 4918782ca1236bac0bb13e08a6b63f8743e0b01e75aSteve Block LayerAndroid* layer = root->rootLayer(); 492d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark SkRect visible; 493d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark calcOurContentVisibleRect(&visible); 494d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark layer->updateFixedLayersPositions(visible); 495d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark layer->updatePositions(); 496d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark } 497d17b63fd154fc79d6c6b99a04fe1a2c42ced4a2fCary Clark#endif 498f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark setVisibleRect(root); 49987962ce00229855c098ba12cee8d5c015a835289Cary Clark m_ring.m_root = root; 50087962ce00229855c098ba12cee8d5c015a835289Cary Clark m_ring.m_frame = frame; 50187962ce00229855c098ba12cee8d5c015a835289Cary Clark m_ring.m_node = node; 50232dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark SkMSec time = SkTime::GetMSecs(); 50332dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark m_ring.m_isPressed = time < m_ringAnimationEnd 50432dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark && m_ringAnimationEnd != UINT_MAX; 50587962ce00229855c098ba12cee8d5c015a835289Cary Clark return true; 50687962ce00229855c098ba12cee8d5c015a835289Cary Clark} 50787962ce00229855c098ba12cee8d5c015a835289Cary Clark 50887962ce00229855c098ba12cee8d5c015a835289Cary Clarkvoid drawCursorPostamble() 50987962ce00229855c098ba12cee8d5c015a835289Cary Clark{ 51032dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark if (m_ringAnimationEnd == UINT_MAX) 5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 51287962ce00229855c098ba12cee8d5c015a835289Cary Clark SkMSec time = SkTime::GetMSecs(); 51387962ce00229855c098ba12cee8d5c015a835289Cary Clark if (time < m_ringAnimationEnd) { 51487962ce00229855c098ba12cee8d5c015a835289Cary Clark // views assume that inval bounds coordinates are non-negative 51587962ce00229855c098ba12cee8d5c015a835289Cary Clark WebCore::IntRect invalBounds(0, 0, INT_MAX, INT_MAX); 516ef1adcdfc805d4d13103f6f15cc5b4d96828a60fPatrick Scott invalBounds.intersect(m_ring.m_absBounds); 51787962ce00229855c098ba12cee8d5c015a835289Cary Clark postInvalidateDelayed(m_ringAnimationEnd - time, invalBounds); 51887962ce00229855c098ba12cee8d5c015a835289Cary Clark } else { 5190924a66d1664f53afd148456e5709c471ff7240aCary Clark hideCursor(const_cast<CachedRoot*>(m_ring.m_root)); 5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 52187962ce00229855c098ba12cee8d5c015a835289Cary Clark} 522846dd02baeb22227f22c9fda72e48f6810568c14Leon Scroggins 523be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roardbool drawGL(WebCore::IntRect& viewRect, WebCore::IntRect* invalRect, WebCore::IntRect& webViewRect, 524be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard int titleBarHeight, WebCore::IntRect& clip, float scale, int extras) 525a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 526a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING) 5273deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger if (!m_baseLayer || inFullScreenMode()) 528a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard return false; 529a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 530e47399f767707497dfc68fc64b14621a8ca9959fTeng-Hui Zhu if (!m_glWebViewState) { 531f3cef498906fce0a2d7787f7475f6df232baaeadCary Clark m_glWebViewState = new GLWebViewState(&m_viewImpl->gButtonMutex); 532fcb01cd64de0a1d6f8f8c897d16cc2628be53960John Reck m_glWebViewState->glExtras()->setCursorRingExtra(&m_ring); 533fcb01cd64de0a1d6f8f8c897d16cc2628be53960John Reck m_glWebViewState->glExtras()->setFindOnPageExtra(&m_findOnPage); 534e47399f767707497dfc68fc64b14621a8ca9959fTeng-Hui Zhu if (m_baseLayer->content()) { 53567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard SkRegion region; 53667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard SkIRect rect; 53767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard rect.set(0, 0, m_baseLayer->content()->width(), m_baseLayer->content()->height()); 53867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard region.setRect(rect); 539dfadaafc15c16563aba837f05c778eaa2a433a8bJohn Reck m_glWebViewState->setBaseLayer(m_baseLayer, region, false, true); 540e47399f767707497dfc68fc64b14621a8ca9959fTeng-Hui Zhu } 541e47399f767707497dfc68fc64b14621a8ca9959fTeng-Hui Zhu } 542c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger 543a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard CachedRoot* root = getFrameCache(AllowNewer); 544a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard if (!root) { 545a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard DBG_NAV_LOG("!root"); 546a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard if (extras == DrawExtrasCursorRing) 547a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard resetCursorRing(); 548a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard } 549a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard DrawExtra* extra = 0; 550a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard switch (extras) { 551a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard case DrawExtrasFind: 552a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard extra = &m_findOnPage; 553a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard break; 554a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard case DrawExtrasSelection: 55562740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck // This will involve a JNI call, but under normal circumstances we will 55662740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck // not hit this anyway. Only if USE_JAVA_TEXT_SELECTION is disabled 55762740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck // in WebView.java will we hit this (so really debug only) 55862740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck updateSelectionHandles(); 559a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard extra = &m_selectText; 560a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard break; 561a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard case DrawExtrasCursorRing: 562a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard if (drawCursorPreamble(root) && m_ring.setup()) { 563b31c03a968a578cc43e606ede80cefcd07e8ee07John Reck if (m_ring.m_isPressed || m_ringAnimationEnd == UINT_MAX) 564a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard extra = &m_ring; 565a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard drawCursorPostamble(); 566a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard } 567a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard break; 568a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard default: 569a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard ; 570a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard } 571a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 572c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger unsigned int pic = m_glWebViewState->currentPictureCounter(); 573fcb01cd64de0a1d6f8f8c897d16cc2628be53960John Reck m_glWebViewState->glExtras()->setDrawExtra(extra); 5740ca8045217bb9b308ddb407d7a9ce17d92d9f9fbNicolas Roard 5750ca8045217bb9b308ddb407d7a9ce17d92d9f9fbNicolas Roard LayerAndroid* compositeLayer = compositeRoot(); 5760ca8045217bb9b308ddb407d7a9ce17d92d9f9fbNicolas Roard if (compositeLayer) 577fcb01cd64de0a1d6f8f8c897d16cc2628be53960John Reck compositeLayer->setExtra(0); 5780ca8045217bb9b308ddb407d7a9ce17d92d9f9fbNicolas Roard 579a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard SkRect visibleRect; 580a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard calcOurContentVisibleRect(&visibleRect); 581d68563709fdf68c90c730155149f6149b084730aJohn Reck // Make sure we have valid coordinates. We might not have valid coords 582d68563709fdf68c90c730155149f6149b084730aJohn Reck // if the zoom manager is still initializing. We will be redrawn 583d68563709fdf68c90c730155149f6149b084730aJohn Reck // once the correct scale is set 584d68563709fdf68c90c730155149f6149b084730aJohn Reck if (!visibleRect.hasValidCoordinates()) 585d68563709fdf68c90c730155149f6149b084730aJohn Reck return false; 58696eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik bool pagesSwapped = false; 587be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard bool ret = m_glWebViewState->drawGL(viewRect, visibleRect, invalRect, 58896eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik webViewRect, titleBarHeight, clip, scale, 58996eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik &pagesSwapped); 59096eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik if (m_pageSwapCallbackRegistered && pagesSwapped) { 59196eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik m_pageSwapCallbackRegistered = false; 59296eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!"); 59396eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik JNIEnv* env = JSC::Bindings::getJNIEnv(); 59496eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik AutoJObject javaObject = m_javaGlue.object(env); 59596eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik if (javaObject.get()) { 59696eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik env->CallVoidMethod(javaObject.get(), m_javaGlue.m_pageSwapCallback); 59796eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik checkException(env); 59896eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik } 59996eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik } 600c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger if (ret || m_glWebViewState->currentPictureCounter() != pic) 601a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard return true; 602a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif 603a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard return false; 604a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 605a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 6066d43b9ceb777071c088fe12ee94af80e34816bcfGrace KlobaPictureSet* draw(SkCanvas* canvas, SkColor bgColor, int extras, bool split) 60787962ce00229855c098ba12cee8d5c015a835289Cary Clark{ 6086d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba PictureSet* ret = 0; 6096d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba if (!m_baseLayer) { 6106d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba canvas->drawColor(bgColor); 6116d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return ret; 6126d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba } 6136d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba 6146d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba // draw the content of the base layer first 6156d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba PictureSet* content = m_baseLayer->content(); 6166d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba int sc = canvas->save(SkCanvas::kClip_SaveFlag); 6176d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba canvas->clipRect(SkRect::MakeLTRB(0, 0, content->width(), 6186d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba content->height()), SkRegion::kDifference_Op); 6196d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba canvas->drawColor(bgColor); 6206d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba canvas->restoreToCount(sc); 6216d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba if (content->draw(canvas)) 6226d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba ret = split ? new PictureSet(*content) : 0; 6236d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba 62487962ce00229855c098ba12cee8d5c015a835289Cary Clark CachedRoot* root = getFrameCache(AllowNewer); 62587962ce00229855c098ba12cee8d5c015a835289Cary Clark if (!root) { 62687962ce00229855c098ba12cee8d5c015a835289Cary Clark DBG_NAV_LOG("!root"); 62787962ce00229855c098ba12cee8d5c015a835289Cary Clark if (extras == DrawExtrasCursorRing) 62887962ce00229855c098ba12cee8d5c015a835289Cary Clark resetCursorRing(); 629846dd02baeb22227f22c9fda72e48f6810568c14Leon Scroggins } 63087962ce00229855c098ba12cee8d5c015a835289Cary Clark LayerAndroid mainPicture(m_navPictureUI); 63187962ce00229855c098ba12cee8d5c015a835289Cary Clark DrawExtra* extra = 0; 63287962ce00229855c098ba12cee8d5c015a835289Cary Clark switch (extras) { 63387962ce00229855c098ba12cee8d5c015a835289Cary Clark case DrawExtrasFind: 63487962ce00229855c098ba12cee8d5c015a835289Cary Clark extra = &m_findOnPage; 63587962ce00229855c098ba12cee8d5c015a835289Cary Clark break; 63687962ce00229855c098ba12cee8d5c015a835289Cary Clark case DrawExtrasSelection: 63762740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck // This will involve a JNI call, but under normal circumstances we will 63862740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck // not hit this anyway. Only if USE_JAVA_TEXT_SELECTION is disabled 63962740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck // in WebView.java will we hit this (so really debug only) 64062740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck updateSelectionHandles(); 64187962ce00229855c098ba12cee8d5c015a835289Cary Clark extra = &m_selectText; 64287962ce00229855c098ba12cee8d5c015a835289Cary Clark break; 64387962ce00229855c098ba12cee8d5c015a835289Cary Clark case DrawExtrasCursorRing: 64487962ce00229855c098ba12cee8d5c015a835289Cary Clark if (drawCursorPreamble(root) && m_ring.setup()) { 64587962ce00229855c098ba12cee8d5c015a835289Cary Clark if (!m_ring.m_isButton) 64687962ce00229855c098ba12cee8d5c015a835289Cary Clark extra = &m_ring; 64787962ce00229855c098ba12cee8d5c015a835289Cary Clark drawCursorPostamble(); 64887962ce00229855c098ba12cee8d5c015a835289Cary Clark } 64987962ce00229855c098ba12cee8d5c015a835289Cary Clark break; 65087962ce00229855c098ba12cee8d5c015a835289Cary Clark default: 65187962ce00229855c098ba12cee8d5c015a835289Cary Clark ; 652846dd02baeb22227f22c9fda72e48f6810568c14Leon Scroggins } 653eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark if (extra) { 654eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark IntRect dummy; // inval area, unused for now 655eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark extra->draw(canvas, &mainPicture, &dummy); 656eabb311cd2b57ff80b4cf632078cf078d789b563Cary Clark } 65787962ce00229855c098ba12cee8d5c015a835289Cary Clark#if USE(ACCELERATED_COMPOSITING) 6586d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba LayerAndroid* compositeLayer = compositeRoot(); 6596d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba if (!compositeLayer) 6606d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return ret; 6616d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba compositeLayer->setExtra(extra); 6625065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark SkRect visible; 6635065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark calcOurContentVisibleRect(&visible); 66487962ce00229855c098ba12cee8d5c015a835289Cary Clark // call this to be sure we've adjusted for any scrolling or animations 66587962ce00229855c098ba12cee8d5c015a835289Cary Clark // before we actually draw 6666d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba compositeLayer->updateFixedLayersPositions(visible); 6676d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba compositeLayer->updatePositions(); 6686d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba // We have to set the canvas' matrix on the base layer 669e93f34788b1f644f8be61a1daf6505c387e6fc3bNicolas Roard // (to have fixed layers work as intended) 670e93f34788b1f644f8be61a1daf6505c387e6fc3bNicolas Roard SkAutoCanvasRestore restore(canvas, true); 6716d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba m_baseLayer->setMatrix(canvas->getTotalMatrix()); 672e93f34788b1f644f8be61a1daf6505c387e6fc3bNicolas Roard canvas->resetMatrix(); 6736d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba m_baseLayer->draw(canvas); 6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 6756d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return ret; 6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 67887962ce00229855c098ba12cee8d5c015a835289Cary Clark 67946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkbool cursorIsTextInput(FrameCachePermission allowNewer) 6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 68146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark CachedRoot* root = getFrameCache(allowNewer); 6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!root) { 6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOG("!root"); 6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 68646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark const CachedNode* cursor = root->currentCursor(); 687f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark if (!cursor) { 688f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark DBG_NAV_LOG("!cursor"); 6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 690f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark } 6911d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark DBG_NAV_LOGD("%s", cursor->isTextInput() ? "true" : "false"); 6921d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark return cursor->isTextInput(); 6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 69546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkvoid cursorRingBounds(WebCore::IntRect* bounds) 6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOGD("%s", ""); 6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedRoot* root = getFrameCache(DontAllowNewer); 6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (root) { 700f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedFrame* cachedFrame; 701f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedNode* cachedNode = root->currentCursor(&cachedFrame); 7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (cachedNode) { 703f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark *bounds = cachedNode->cursorRingBounds(cachedFrame); 7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOGD("bounds={%d,%d,%d,%d}", bounds->x(), bounds->y(), 7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bounds->width(), bounds->height()); 7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *bounds = WebCore::IntRect(0, 0, 0, 0); 7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 71236747fa778285f57f2f53c047028be83e9d8776dCary Clarkvoid fixCursor() 71336747fa778285f57f2f53c047028be83e9d8776dCary Clark{ 71436747fa778285f57f2f53c047028be83e9d8776dCary Clark m_viewImpl->gCursorBoundsMutex.lock(); 71536747fa778285f57f2f53c047028be83e9d8776dCary Clark bool hasCursorBounds = m_viewImpl->m_hasCursorBounds; 71636747fa778285f57f2f53c047028be83e9d8776dCary Clark IntRect bounds = m_viewImpl->m_cursorBounds; 71736747fa778285f57f2f53c047028be83e9d8776dCary Clark m_viewImpl->gCursorBoundsMutex.unlock(); 71836747fa778285f57f2f53c047028be83e9d8776dCary Clark if (!hasCursorBounds) 71936747fa778285f57f2f53c047028be83e9d8776dCary Clark return; 72036747fa778285f57f2f53c047028be83e9d8776dCary Clark int x, y; 72136747fa778285f57f2f53c047028be83e9d8776dCary Clark const CachedFrame* frame; 722a34b1107b2542fa334fd4db2d58e2df849e083b0Cary Clark const CachedNode* node = m_frameCacheUI->findAt(bounds, &frame, &x, &y, true); 72336747fa778285f57f2f53c047028be83e9d8776dCary Clark if (!node) 72436747fa778285f57f2f53c047028be83e9d8776dCary Clark return; 72536747fa778285f57f2f53c047028be83e9d8776dCary Clark // require that node have approximately the same bounds (+/- 4) and the same 72636747fa778285f57f2f53c047028be83e9d8776dCary Clark // center (+/- 2) 72736747fa778285f57f2f53c047028be83e9d8776dCary Clark IntPoint oldCenter = IntPoint(bounds.x() + (bounds.width() >> 1), 72836747fa778285f57f2f53c047028be83e9d8776dCary Clark bounds.y() + (bounds.height() >> 1)); 729f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark IntRect newBounds = node->bounds(frame); 73036747fa778285f57f2f53c047028be83e9d8776dCary Clark IntPoint newCenter = IntPoint(newBounds.x() + (newBounds.width() >> 1), 73136747fa778285f57f2f53c047028be83e9d8776dCary Clark newBounds.y() + (newBounds.height() >> 1)); 73236747fa778285f57f2f53c047028be83e9d8776dCary Clark DBG_NAV_LOGD("oldCenter=(%d,%d) newCenter=(%d,%d)" 73336747fa778285f57f2f53c047028be83e9d8776dCary Clark " bounds=(%d,%d,w=%d,h=%d) newBounds=(%d,%d,w=%d,h=%d)", 73436747fa778285f57f2f53c047028be83e9d8776dCary Clark oldCenter.x(), oldCenter.y(), newCenter.x(), newCenter.y(), 73536747fa778285f57f2f53c047028be83e9d8776dCary Clark bounds.x(), bounds.y(), bounds.width(), bounds.height(), 73636747fa778285f57f2f53c047028be83e9d8776dCary Clark newBounds.x(), newBounds.y(), newBounds.width(), newBounds.height()); 73736747fa778285f57f2f53c047028be83e9d8776dCary Clark if (abs(oldCenter.x() - newCenter.x()) > 2) 73836747fa778285f57f2f53c047028be83e9d8776dCary Clark return; 73936747fa778285f57f2f53c047028be83e9d8776dCary Clark if (abs(oldCenter.y() - newCenter.y()) > 2) 74036747fa778285f57f2f53c047028be83e9d8776dCary Clark return; 74136747fa778285f57f2f53c047028be83e9d8776dCary Clark if (abs(bounds.x() - newBounds.x()) > 4) 74236747fa778285f57f2f53c047028be83e9d8776dCary Clark return; 74336747fa778285f57f2f53c047028be83e9d8776dCary Clark if (abs(bounds.y() - newBounds.y()) > 4) 74436747fa778285f57f2f53c047028be83e9d8776dCary Clark return; 7451ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block if (abs(bounds.maxX() - newBounds.maxX()) > 4) 74636747fa778285f57f2f53c047028be83e9d8776dCary Clark return; 7471ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block if (abs(bounds.maxY() - newBounds.maxY()) > 4) 74836747fa778285f57f2f53c047028be83e9d8776dCary Clark return; 74936747fa778285f57f2f53c047028be83e9d8776dCary Clark DBG_NAV_LOGD("node=%p frame=%p x=%d y=%d bounds=(%d,%d,w=%d,h=%d)", 75036747fa778285f57f2f53c047028be83e9d8776dCary Clark node, frame, x, y, bounds.x(), bounds.y(), bounds.width(), 75136747fa778285f57f2f53c047028be83e9d8776dCary Clark bounds.height()); 75236747fa778285f57f2f53c047028be83e9d8776dCary Clark m_frameCacheUI->setCursor(const_cast<CachedFrame*>(frame), 75336747fa778285f57f2f53c047028be83e9d8776dCary Clark const_cast<CachedNode*>(node)); 75436747fa778285f57f2f53c047028be83e9d8776dCary Clark} 75536747fa778285f57f2f53c047028be83e9d8776dCary Clark 7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCachedRoot* getFrameCache(FrameCachePermission allowNewer) 7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 75846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark if (!m_viewImpl->m_updatedFrameCache) { 75949e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark DBG_NAV_LOGV("%s", "!m_viewImpl->m_updatedFrameCache"); 7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_frameCacheUI; 76146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark } 76246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark if (allowNewer == DontAllowNewer && m_viewImpl->m_lastGeneration < m_generation) { 76346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark DBG_NAV_LOGD("allowNewer==DontAllowNewer m_viewImpl->m_lastGeneration=%d" 76446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark " < m_generation=%d", m_viewImpl->m_lastGeneration, m_generation); 7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_frameCacheUI; 76646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark } 7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOGD("%s", "m_viewImpl->m_updatedFrameCache == true"); 768f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedFrame* oldCursorFrame; 769f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedNode* oldCursorNode = m_frameCacheUI ? 770f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark m_frameCacheUI->currentCursor(&oldCursorFrame) : 0; 771f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark#if USE(ACCELERATED_COMPOSITING) 772be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark int layerId = -1; 773be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark if (oldCursorNode && oldCursorNode->isInLayer()) { 774be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark const LayerAndroid* cursorLayer = oldCursorFrame->layer(oldCursorNode) 775be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark ->layer(m_frameCacheUI->rootLayer()); 776be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark if (cursorLayer) 777be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark layerId = cursorLayer->uniqueId(); 778be4ea5d07252747b3faad9dd63d4bebe79f24db3Cary Clark } 779f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark#endif 780f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark // get id from old layer and use to find new layer 7813a752d13620eb15148e87a028d66932c74a27993Cary Clark bool oldFocusIsTextInput = false; 7823a752d13620eb15148e87a028d66932c74a27993Cary Clark void* oldFocusNodePointer = 0; 7833a752d13620eb15148e87a028d66932c74a27993Cary Clark if (m_frameCacheUI) { 7843a752d13620eb15148e87a028d66932c74a27993Cary Clark const CachedNode* oldFocus = m_frameCacheUI->currentFocus(); 7853a752d13620eb15148e87a028d66932c74a27993Cary Clark if (oldFocus) { 7863a752d13620eb15148e87a028d66932c74a27993Cary Clark oldFocusIsTextInput = oldFocus->isTextInput(); 7873a752d13620eb15148e87a028d66932c74a27993Cary Clark oldFocusNodePointer = oldFocus->nodePointer(); 7883a752d13620eb15148e87a028d66932c74a27993Cary Clark } 7893a752d13620eb15148e87a028d66932c74a27993Cary Clark } 7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_viewImpl->gFrameCacheMutex.lock(); 7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete m_frameCacheUI; 792b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger SkSafeUnref(m_navPictureUI); 7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_viewImpl->m_updatedFrameCache = false; 7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frameCacheUI = m_viewImpl->m_frameCacheKit; 7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_navPictureUI = m_viewImpl->m_navPictureKit; 7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_viewImpl->m_frameCacheKit = 0; 7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_viewImpl->m_navPictureKit = 0; 7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_viewImpl->gFrameCacheMutex.unlock(); 799f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark if (m_frameCacheUI) 8006d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba m_frameCacheUI->setRootLayer(compositeRoot()); 801f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark#if USE(ACCELERATED_COMPOSITING) 802f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark if (layerId >= 0) { 8035065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark SkRect visible; 8045065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark calcOurContentVisibleRect(&visible); 805f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark LayerAndroid* layer = const_cast<LayerAndroid*>( 806cdd7f6d80774ba3a374f09f22f7cb6bcfca24fa5Mike Reed m_frameCacheUI->rootLayer()); 807cdd7f6d80774ba3a374f09f22f7cb6bcfca24fa5Mike Reed if (layer) { 808fa26a8dd531dff44d6cad0700ff32c0bb949392cNicolas Roard layer->updateFixedLayersPositions(visible); 809fa26a8dd531dff44d6cad0700ff32c0bb949392cNicolas Roard layer->updatePositions(); 810cdd7f6d80774ba3a374f09f22f7cb6bcfca24fa5Mike Reed } 811f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark } 812f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark#endif 81336747fa778285f57f2f53c047028be83e9d8776dCary Clark fixCursor(); 8143a752d13620eb15148e87a028d66932c74a27993Cary Clark if (oldFocusIsTextInput) { 81595fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins const CachedNode* newFocus = m_frameCacheUI->currentFocus(); 8163a752d13620eb15148e87a028d66932c74a27993Cary Clark if (newFocus && oldFocusNodePointer != newFocus->nodePointer() 8173a752d13620eb15148e87a028d66932c74a27993Cary Clark && newFocus->isTextInput() 81895fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins && newFocus != m_frameCacheUI->currentCursor()) { 81995fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins // The focus has changed. We may need to update things. 82095fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!"); 82195fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins JNIEnv* env = JSC::Bindings::getJNIEnv(); 822b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 823b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (javaObject.get()) { 824b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block env->CallVoidMethod(javaObject.get(), m_javaGlue.m_domChangedFocus); 825b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block checkException(env); 826b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block } 82795fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins } 82895fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins } 829f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark if (oldCursorNode && (!m_frameCacheUI || !m_frameCacheUI->currentCursor())) 83046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark viewInvalidate(); // redraw in case cursor ring is still visible 8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_frameCacheUI; 8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint getScaledMaxXScroll() 8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!"); 8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 838b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 839b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 840b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return 0; 841b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block int result = env->CallIntMethod(javaObject.get(), m_javaGlue.m_getScaledMaxXScroll); 8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint getScaledMaxYScroll() 8478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!"); 8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 850b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 851b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 852b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return 0; 853b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block int result = env->CallIntMethod(javaObject.get(), m_javaGlue.m_getScaledMaxYScroll); 8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 858af03a3d6830584ef606be2d1c64845815dadb146Cary ClarkIntRect getVisibleRect() 8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 860af03a3d6830584ef606be2d1c64845815dadb146Cary Clark IntRect rect; 8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!"); 8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 863b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 864b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 865b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return rect; 866b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block jobject jRect = env->CallObjectMethod(javaObject.get(), m_javaGlue.m_getVisibleRect); 8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 868af03a3d6830584ef606be2d1c64845815dadb146Cary Clark rect.setX(env->GetIntField(jRect, m_javaGlue.m_rectLeft)); 8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 870af03a3d6830584ef606be2d1c64845815dadb146Cary Clark rect.setY(env->GetIntField(jRect, m_javaGlue.m_rectTop)); 8718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 872af03a3d6830584ef606be2d1c64845815dadb146Cary Clark rect.setWidth(env->CallIntMethod(jRect, m_javaGlue.m_rectWidth)); 8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 874af03a3d6830584ef606be2d1c64845815dadb146Cary Clark rect.setHeight(env->CallIntMethod(jRect, m_javaGlue.m_rectHeight)); 8758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project env->DeleteLocalRef(jRect); 8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 878af03a3d6830584ef606be2d1c64845815dadb146Cary Clark return rect; 8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 881652e9a017a7c5c772361bf57279fae0c26992329Jeff Brownstatic CachedFrame::Direction KeyToDirection(int32_t keyCode) 8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (keyCode) { 884652e9a017a7c5c772361bf57279fae0c26992329Jeff Brown case AKEYCODE_DPAD_RIGHT: 8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOGD("keyCode=%s", "right"); 8868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return CachedFrame::RIGHT; 887652e9a017a7c5c772361bf57279fae0c26992329Jeff Brown case AKEYCODE_DPAD_LEFT: 8888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOGD("keyCode=%s", "left"); 8898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return CachedFrame::LEFT; 890652e9a017a7c5c772361bf57279fae0c26992329Jeff Brown case AKEYCODE_DPAD_DOWN: 8918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOGD("keyCode=%s", "down"); 8928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return CachedFrame::DOWN; 893652e9a017a7c5c772361bf57279fae0c26992329Jeff Brown case AKEYCODE_DPAD_UP: 8948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOGD("keyCode=%s", "up"); 8958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return CachedFrame::UP; 8968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project default: 897b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark DBG_NAV_LOGD("bad key %d sent", keyCode); 8988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return CachedFrame::UNINITIALIZED; 8998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 90245b64f60af3cbfa8c78388e35e9b669a0c284bdcBen MurdochWTF::String imageURI(int x, int y) 9038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const CachedRoot* root = getFrameCache(DontAllowNewer); 90545b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch return root ? root->imageURI(x, y) : WTF::String(); 9068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 908f4669cac3858848a9247e801b6106aeae6d406e8Cary Clarkbool cursorWantsKeyEvents() 9098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const CachedRoot* root = getFrameCache(DontAllowNewer); 9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (root) { 912f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark const CachedNode* focus = root->currentCursor(); 91346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark if (focus) 914f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark return focus->wantsKeyEvents(); 9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 91969bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins 92046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark/* returns true if the key had no effect (neither scrolled nor changed cursor) */ 9214ca8bc94f71466d1109bfbb9ef00da3256a0899bCary Clarkbool moveCursor(int keyCode, int count, bool ignoreScroll) 9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedRoot* root = getFrameCache(AllowNewer); 9248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!root) { 9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOG("!root"); 9268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 9278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 92946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark m_viewImpl->m_moveGeneration++; 930652e9a017a7c5c772361bf57279fae0c26992329Jeff Brown CachedFrame::Direction direction = KeyToDirection(keyCode); 9318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const CachedFrame* cachedFrame, * oldFrame = 0; 93246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark const CachedNode* cursor = root->currentCursor(&oldFrame); 93346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark WebCore::IntPoint cursorLocation = root->cursorLocation(); 93446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark DBG_NAV_LOGD("old cursor %d (nativeNode=%p) cursorLocation={%d, %d}", 93546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark cursor ? cursor->index() : 0, 93646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark cursor ? cursor->nodePointer() : 0, cursorLocation.x(), cursorLocation.y()); 937f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark WebCore::IntRect visibleRect = setVisibleRect(root); 9388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int xMax = getScaledMaxXScroll(); 9398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int yMax = getScaledMaxYScroll(); 9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project root->setMaxScroll(xMax, yMax); 9418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const CachedNode* cachedNode = 0; 9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int dx = 0; 9438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int dy = 0; 9448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int counter = count; 9458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (--counter >= 0) { 9468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebCore::IntPoint scroll = WebCore::IntPoint(0, 0); 94746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark cachedNode = root->moveCursor(direction, &cachedFrame, &scroll); 9488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dx += scroll.x(); 9498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dy += scroll.y(); 9508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 95146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark DBG_NAV_LOGD("new cursor %d (nativeNode=%p) cursorLocation={%d, %d}" 95246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark "bounds={%d,%d,w=%d,h=%d}", cachedNode ? cachedNode->index() : 0, 95346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark cachedNode ? cachedNode->nodePointer() : 0, 95446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark root->cursorLocation().x(), root->cursorLocation().y(), 955f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark cachedNode ? cachedNode->bounds(cachedFrame).x() : 0, 956f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark cachedNode ? cachedNode->bounds(cachedFrame).y() : 0, 957f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark cachedNode ? cachedNode->bounds(cachedFrame).width() : 0, 958f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark cachedNode ? cachedNode->bounds(cachedFrame).height() : 0); 9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If !m_heightCanMeasure (such as in the browser), we want to scroll no 9608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // matter what 9618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!ignoreScroll && (!m_heightCanMeasure || 9628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project !cachedNode || 96346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (cursor && cursor->nodePointer() == cachedNode->nodePointer()))) 9648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 9658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (count == 1 && dx != 0 && dy == 0 && -m_lastDx == dx && 9668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SkTime::GetMSecs() - m_lastDxTime < 1000) 9678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project root->checkForJiggle(&dx); 9688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOGD("scrollBy %d,%d", dx, dy); 9698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ((dx | dy)) 9708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project this->scrollBy(dx, dy); 9718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_lastDx = dx; 9728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_lastDxTime = SkTime::GetMSecs(); 9738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool result = false; 9758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (cachedNode) { 97632dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark showCursorUntimed(); 97787962ce00229855c098ba12cee8d5c015a835289Cary Clark m_viewImpl->updateCursorBounds(root, cachedFrame, cachedNode); 97890bd422df8e04c486d29c4041acf1c4cf7c3b155Leon Scroggins root->setCursor(const_cast<CachedFrame*>(cachedFrame), 97990bd422df8e04c486d29c4041acf1c4cf7c3b155Leon Scroggins const_cast<CachedNode*>(cachedNode)); 9804ba38126aa5964cd2e1922f3234c745032b5db59Leon Scroggins const CachedNode* focus = root->currentFocus(); 9810a506c68f4ad915ee62e7bf4f22f58b24d078d56Leon Scroggins bool clearTextEntry = cachedNode != focus && focus 9820a506c68f4ad915ee62e7bf4f22f58b24d078d56Leon Scroggins && cachedNode->nodePointer() != focus->nodePointer() && focus->isTextInput(); 98394f12574c74b11db011b994e462f64a112952a47Leon Scroggins // Stop painting the caret if the old focus was a text input and so is the new cursor. 98494f12574c74b11db011b994e462f64a112952a47Leon Scroggins bool stopPaintingCaret = clearTextEntry && cachedNode->wantsKeyEvents(); 98594f12574c74b11db011b994e462f64a112952a47Leon Scroggins sendMoveMouseIfLatest(clearTextEntry, stopPaintingCaret); 9868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 9878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int docHeight = root->documentHeight(); 9888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int docWidth = root->documentWidth(); 9891ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block if (visibleRect.maxY() + dy > docHeight) 9901ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block dy = docHeight - visibleRect.maxY(); 9918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (visibleRect.y() + dy < 0) 9928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dy = -visibleRect.y(); 9931ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block if (visibleRect.maxX() + dx > docWidth) 9941ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block dx = docWidth - visibleRect.maxX(); 9958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (visibleRect.x() < 0) 9968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dx = -visibleRect.x(); 9978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = direction == CachedFrame::LEFT ? dx >= 0 : 9988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project direction == CachedFrame::RIGHT ? dx <= 0 : 9998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project direction == CachedFrame::UP ? dy >= 0 : dy <= 0; 10008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 10028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid notifyProgressFinished() 10058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 100646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark DBG_NAV_LOGD("cursorIsTextInput=%d", cursorIsTextInput(DontAllowNewer)); 100795fa6e99128685c55e9be6f4362e67c288482a74Leon Scroggins rebuildWebTextView(); 10088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if DEBUG_NAV_UI 10098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frameCacheUI) { 10108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const CachedNode* focus = m_frameCacheUI->currentFocus(); 10118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOGD("focus %d (nativeNode=%p)", 10128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project focus ? focus->index() : 0, 10138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project focus ? focus->nodePointer() : 0); 10148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 10168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst CachedNode* findAt(CachedRoot* root, const WebCore::IntRect& rect, 10198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const CachedFrame** framePtr, int* rxPtr, int* ryPtr) 10208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *rxPtr = 0; 10228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *ryPtr = 0; 10238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *framePtr = 0; 10248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!root) 10258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 1026f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark setVisibleRect(root); 1027f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark return root->findAt(rect, framePtr, rxPtr, ryPtr, true); 1028f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark} 1029f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark 1030f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary ClarkIntRect setVisibleRect(CachedRoot* root) 1031f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{ 1032af03a3d6830584ef606be2d1c64845815dadb146Cary Clark IntRect visibleRect = getVisibleRect(); 1033f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark DBG_NAV_LOGD("getVisibleRect %d,%d,%d,%d", 1034f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark visibleRect.x(), visibleRect.y(), visibleRect.width(), visibleRect.height()); 10358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project root->setVisibleRect(visibleRect); 1036f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark return visibleRect; 10378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid selectBestAt(const WebCore::IntRect& rect) 10408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const CachedFrame* frame; 10428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int rx, ry; 1043f1610d01f92cb77827d2de13c0ed38554e4f0790Cary Clark CachedRoot* root = getFrameCache(AllowNewer); 1044f81c672a4f5c06621000a6df0984cde689397d94Cary Clark if (!root) 1045f81c672a4f5c06621000a6df0984cde689397d94Cary Clark return; 10468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const CachedNode* node = findAt(root, rect, &frame, &rx, &ry); 10478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!node) { 10488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOGD("no nodes found root=%p", root); 1049fb934b7878723bd752b558aee4047f9aee19405eTeng-Hui Zhu root->rootHistory()->setMouseBounds(rect); 105069bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins m_viewImpl->m_hasCursorBounds = false; 1051b41f6483040a4269f2761648f5fa528ca602df5dCary Clark root->setCursor(0, 0); 105232dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark viewInvalidate(); 105346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark } else { 105446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark DBG_NAV_LOGD("CachedNode:%p (%d)", node, node->index()); 1055ef1adcdfc805d4d13103f6f15cc5b4d96828a60fPatrick Scott WebCore::IntRect bounds = node->bounds(frame); 1056b0c9a2b4033eca931163e8223d7eaa8889337144Patrick Scott root->rootHistory()->setMouseBounds(bounds); 105787962ce00229855c098ba12cee8d5c015a835289Cary Clark m_viewImpl->updateCursorBounds(root, frame, node); 105832dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark showCursorTimed(); 105946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark root->setCursor(const_cast<CachedFrame*>(frame), 106090bd422df8e04c486d29c4041acf1c4cf7c3b155Leon Scroggins const_cast<CachedNode*>(node)); 10618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 106294f12574c74b11db011b994e462f64a112952a47Leon Scroggins sendMoveMouseIfLatest(false, false); 10638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1065d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkconst CachedNode* m_cacheHitNode; 1066d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkconst CachedFrame* m_cacheHitFrame; 1067d4924af12855cd19162ba1442a6055664c98ca32Cary Clark 1068d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkbool pointInNavCache(int x, int y, int slop) 1069d4924af12855cd19162ba1442a6055664c98ca32Cary Clark{ 1070d4924af12855cd19162ba1442a6055664c98ca32Cary Clark CachedRoot* root = getFrameCache(AllowNewer); 1071d4924af12855cd19162ba1442a6055664c98ca32Cary Clark if (!root) 1072d4924af12855cd19162ba1442a6055664c98ca32Cary Clark return false; 1073d4924af12855cd19162ba1442a6055664c98ca32Cary Clark IntRect rect = IntRect(x - slop, y - slop, slop * 2, slop * 2); 1074d4924af12855cd19162ba1442a6055664c98ca32Cary Clark int rx, ry; 1075d4924af12855cd19162ba1442a6055664c98ca32Cary Clark return (m_cacheHitNode = findAt(root, rect, &m_cacheHitFrame, &rx, &ry)); 1076d4924af12855cd19162ba1442a6055664c98ca32Cary Clark} 1077d4924af12855cd19162ba1442a6055664c98ca32Cary Clark 107846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkbool motionUp(int x, int y, int slop) 10798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool pageScrolled = false; 1081d4924af12855cd19162ba1442a6055664c98ca32Cary Clark IntRect rect = IntRect(x - slop, y - slop, slop * 2, slop * 2); 10828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int rx, ry; 10838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedRoot* root = getFrameCache(AllowNewer); 108473d131bc28aa2a68fe686ffd9426814448f5da7bCary Clark if (!root) 1085d4924af12855cd19162ba1442a6055664c98ca32Cary Clark return 0; 1086d4924af12855cd19162ba1442a6055664c98ca32Cary Clark const CachedFrame* frame = 0; 1087af3b7507bd6d2b10fce43aa0728b8afcf5cddd86Cary Clark const CachedNode* result = findAt(root, rect, &frame, &rx, &ry); 1088ec079933211eb47479b2624cb6be72257d178c01Cary Clark CachedHistory* history = root->rootHistory(); 10898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!result) { 10908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOGD("no nodes found root=%p", root); 1091ec079933211eb47479b2624cb6be72257d178c01Cary Clark history->setNavBounds(rect); 109269bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins m_viewImpl->m_hasCursorBounds = false; 109369bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins root->hideCursor(); 109469bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins int dx = root->checkForCenter(x, y); 109569bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins if (dx) { 109669bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins scrollBy(dx, 0); 109769bc830e96bb6bad9213ac83f746996a1392eee9Leon Scroggins pageScrolled = true; 10988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 109946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark sendMotionUp(frame ? (WebCore::Frame*) frame->framePointer() : 0, 1100ee260612d8744993644f2e0b0f1fed51423be6dbLeon Scroggins 0, x, y); 110146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark viewInvalidate(); 11028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return pageScrolled; 11038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOGD("CachedNode:%p (%d) x=%d y=%d rx=%d ry=%d", result, 11058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result->index(), x, y, rx, ry); 110615f1e443f22288ee82cde972517ebf3cc1153d97Leon Scroggins WebCore::IntRect navBounds = WebCore::IntRect(rx, ry, 1, 1); 1107ec079933211eb47479b2624cb6be72257d178c01Cary Clark history->setNavBounds(navBounds); 1108ec079933211eb47479b2624cb6be72257d178c01Cary Clark history->setMouseBounds(navBounds); 110987962ce00229855c098ba12cee8d5c015a835289Cary Clark m_viewImpl->updateCursorBounds(root, frame, result); 111046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark root->setCursor(const_cast<CachedFrame*>(frame), 11118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const_cast<CachedNode*>(result)); 111232dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark if (result->isSyntheticLink()) 111332dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark overrideUrlLoading(result->getExport()); 111432dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark else { 111546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark sendMotionUp( 111634bca311c8205ee40379adac2ef4da01e401600eCary Clark (WebCore::Frame*) frame->framePointer(), 1117ee260612d8744993644f2e0b0f1fed51423be6dbLeon Scroggins (WebCore::Node*) result->nodePointer(), rx, ry); 111846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark } 111932dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark if (result->isTextInput() || result->isSelect() 112032dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark || result->isContentEditable()) { 112132dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark showCursorUntimed(); 112232dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark } else 112332dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark showCursorTimed(); 11248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return pageScrolled; 11258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 112782f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if USE(ACCELERATED_COMPOSITING) 1128f81c672a4f5c06621000a6df0984cde689397d94Cary Clarkstatic const ScrollableLayerAndroid* findScrollableLayer( 1129f81c672a4f5c06621000a6df0984cde689397d94Cary Clark const LayerAndroid* parent, int x, int y, SkIRect* foundBounds) { 113082f247bdbb98dd80c44209d87692c650c3704617Patrick Scott SkRect bounds; 113182f247bdbb98dd80c44209d87692c650c3704617Patrick Scott parent->bounds(&bounds); 113282f247bdbb98dd80c44209d87692c650c3704617Patrick Scott // Check the parent bounds first; this will clip to within a masking layer's 113382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott // bounds. 1134fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott if (parent->masksToBounds() && !bounds.contains(x, y)) 113582f247bdbb98dd80c44209d87692c650c3704617Patrick Scott return 0; 113682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott // Move the hit test local to parent. 113782f247bdbb98dd80c44209d87692c650c3704617Patrick Scott x -= bounds.fLeft; 113882f247bdbb98dd80c44209d87692c650c3704617Patrick Scott y -= bounds.fTop; 113982f247bdbb98dd80c44209d87692c650c3704617Patrick Scott int count = parent->countChildren(); 11401a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott while (count--) { 11411a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott const LayerAndroid* child = parent->getChild(count); 1142f81c672a4f5c06621000a6df0984cde689397d94Cary Clark const ScrollableLayerAndroid* result = findScrollableLayer(child, x, y, 1143f81c672a4f5c06621000a6df0984cde689397d94Cary Clark foundBounds); 1144f81c672a4f5c06621000a6df0984cde689397d94Cary Clark if (result) { 1145f81c672a4f5c06621000a6df0984cde689397d94Cary Clark foundBounds->offset(bounds.fLeft, bounds.fTop); 1146f81c672a4f5c06621000a6df0984cde689397d94Cary Clark if (parent->masksToBounds()) { 1147f81c672a4f5c06621000a6df0984cde689397d94Cary Clark if (bounds.width() < foundBounds->width()) 1148f81c672a4f5c06621000a6df0984cde689397d94Cary Clark foundBounds->fRight = foundBounds->fLeft + bounds.width(); 1149f81c672a4f5c06621000a6df0984cde689397d94Cary Clark if (bounds.height() < foundBounds->height()) 1150f81c672a4f5c06621000a6df0984cde689397d94Cary Clark foundBounds->fBottom = foundBounds->fTop + bounds.height(); 1151f81c672a4f5c06621000a6df0984cde689397d94Cary Clark } 115282f247bdbb98dd80c44209d87692c650c3704617Patrick Scott return result; 1153f81c672a4f5c06621000a6df0984cde689397d94Cary Clark } 115482f247bdbb98dd80c44209d87692c650c3704617Patrick Scott } 1155f81c672a4f5c06621000a6df0984cde689397d94Cary Clark if (parent->contentIsScrollable()) { 1156f81c672a4f5c06621000a6df0984cde689397d94Cary Clark foundBounds->set(0, 0, bounds.width(), bounds.height()); 1157fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott return static_cast<const ScrollableLayerAndroid*>(parent); 1158f81c672a4f5c06621000a6df0984cde689397d94Cary Clark } 115982f247bdbb98dd80c44209d87692c650c3704617Patrick Scott return 0; 116082f247bdbb98dd80c44209d87692c650c3704617Patrick Scott} 116182f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif 116282f247bdbb98dd80c44209d87692c650c3704617Patrick Scott 1163f81c672a4f5c06621000a6df0984cde689397d94Cary Clarkint scrollableLayer(int x, int y, SkIRect* layerRect, SkIRect* bounds) 1164a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{ 116582f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if USE(ACCELERATED_COMPOSITING) 1166af03a3d6830584ef606be2d1c64845815dadb146Cary Clark const LayerAndroid* layerRoot = compositeRoot(); 1167af03a3d6830584ef606be2d1c64845815dadb146Cary Clark if (!layerRoot) 1168a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott return 0; 1169f81c672a4f5c06621000a6df0984cde689397d94Cary Clark const ScrollableLayerAndroid* result = findScrollableLayer(layerRoot, x, y, 1170f81c672a4f5c06621000a6df0984cde689397d94Cary Clark bounds); 117122e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott if (result) { 117222e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott result->getScrollRect(layerRect); 11738598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott return result->uniqueId(); 117422e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott } 1175a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#endif 1176a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott return 0; 1177a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott} 1178a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott 1179fa768f11d82c34980cce020f442329299efb08caCary Clarkint getBlockLeftEdge(int x, int y, float scale) 1180a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba{ 1181a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba CachedRoot* root = getFrameCache(AllowNewer); 1182a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba if (root) 1183fa768f11d82c34980cce020f442329299efb08caCary Clark return root->getBlockLeftEdge(x, y, scale); 1184a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba return -1; 1185a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba} 1186a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba 118745b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdochvoid overrideUrlLoading(const WTF::String& url) 11888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 1190b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 1191b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 1192b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return; 119379b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block jstring jName = wtfStringToJstring(env, url); 1194b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block env->CallVoidMethod(javaObject.get(), m_javaGlue.m_overrideLoading, jName); 11958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project env->DeleteLocalRef(jName); 11968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid setFindIsUp(bool up) 11998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1200afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark DBG_NAV_LOGD("up=%d", up); 12018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_viewImpl->m_findIsUp = up; 1202afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark} 1203afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark 1204afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clarkvoid setFindIsEmpty() 1205afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark{ 1206afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark DBG_NAV_LOG(""); 1207afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark m_findOnPage.clearCurrentLocation(); 12088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 121032dffb883f56b18019afa7a01b2564b993b3fe8eCary Clarkvoid showCursorTimed() 12118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 121232dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark DBG_NAV_LOG(""); 1213b31c03a968a578cc43e606ede80cefcd07e8ee07John Reck m_ringAnimationEnd = SkTime::GetMSecs() + PRESSED_STATE_DURATION; 121432dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark viewInvalidate(); 121532dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark} 121632dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark 121732dffb883f56b18019afa7a01b2564b993b3fe8eCary Clarkvoid showCursorUntimed() 121832dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark{ 121932dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark DBG_NAV_LOG(""); 12207a69d7c255012f3fcc4d9af040600eac1b2e5c56Cary Clark m_ring.m_isPressed = false; 122132dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark m_ringAnimationEnd = UINT_MAX; 122232dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark viewInvalidate(); 12238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid setHeightCanMeasure(bool measure) 12268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_heightCanMeasure = measure; 12288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 123087962ce00229855c098ba12cee8d5c015a835289Cary ClarkString getSelection() 12318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 123287962ce00229855c098ba12cee8d5c015a835289Cary Clark return m_selectText.getSelection(); 12338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1235a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkvoid moveSelection(int x, int y) 12368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1237af03a3d6830584ef606be2d1c64845815dadb146Cary Clark m_selectText.moveSelection(getVisibleRect(), x, y); 12388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1240515943cc7c9a60faa661739271d5fa14fcba9df8Cary ClarkIntPoint selectableText() 1241515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark{ 1242515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark const CachedRoot* root = getFrameCache(DontAllowNewer); 1243515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark if (!root) 1244515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark return IntPoint(0, 0); 1245515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark return m_selectText.selectableText(root); 1246515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark} 1247515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark 1248a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkvoid selectAll() 1249a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 1250af03a3d6830584ef606be2d1c64845815dadb146Cary Clark m_selectText.selectAll(); 1251a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 1252a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 1253a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkint selectionX() 1254a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 1255a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark return m_selectText.selectionX(); 1256a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 1257a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 1258a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkint selectionY() 1259a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 1260a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark return m_selectText.selectionY(); 1261a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 1262a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 1263a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkvoid resetSelection() 1264a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 1265a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark m_selectText.reset(); 1266a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 1267a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 1268a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkbool startSelection(int x, int y) 1269a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 1270af03a3d6830584ef606be2d1c64845815dadb146Cary Clark const CachedRoot* root = getFrameCache(DontAllowNewer); 1271af03a3d6830584ef606be2d1c64845815dadb146Cary Clark if (!root) 1272af03a3d6830584ef606be2d1c64845815dadb146Cary Clark return false; 127362740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck updateSelectionHandles(); 1274af03a3d6830584ef606be2d1c64845815dadb146Cary Clark return m_selectText.startSelection(root, getVisibleRect(), x, y); 1275a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 1276a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 1277a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkbool wordSelection(int x, int y) 1278a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 12799432ba4878ebf79acd4424398b344c154f452db2Cary Clark const CachedRoot* root = getFrameCache(DontAllowNewer); 12809432ba4878ebf79acd4424398b344c154f452db2Cary Clark if (!root) 1281a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark return false; 128262740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck updateSelectionHandles(); 12839432ba4878ebf79acd4424398b344c154f452db2Cary Clark return m_selectText.wordSelection(root, getVisibleRect(), x, y); 1284a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 1285a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 1286a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkbool extendSelection(int x, int y) 1287a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 1288af03a3d6830584ef606be2d1c64845815dadb146Cary Clark m_selectText.extendSelection(getVisibleRect(), x, y); 1289a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark return true; 1290a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 1291a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 1292a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkbool hitSelection(int x, int y) 1293a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 129462740ff35119cc54e82b6af582a01dd34b9e027eJohn Reck updateSelectionHandles(); 1295a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark return m_selectText.hitSelection(x, y); 1296a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 1297a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 1298a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkvoid setExtendSelection() 1299a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 1300a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark m_selectText.setExtendSelection(true); 1301a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 1302a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 1303a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkvoid setSelectionPointer(bool set, float scale, int x, int y) 13048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 130587962ce00229855c098ba12cee8d5c015a835289Cary Clark m_selectText.setDrawPointer(set); 130687962ce00229855c098ba12cee8d5c015a835289Cary Clark if (!set) 130787962ce00229855c098ba12cee8d5c015a835289Cary Clark return; 130887962ce00229855c098ba12cee8d5c015a835289Cary Clark m_selectText.m_inverseScale = scale; 130987962ce00229855c098ba12cee8d5c015a835289Cary Clark m_selectText.m_selectX = x; 131087962ce00229855c098ba12cee8d5c015a835289Cary Clark m_selectText.m_selectY = y; 13118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1313bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scrogginsvoid sendMoveFocus(WebCore::Frame* framePtr, WebCore::Node* nodePtr) 1314bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins{ 13155e5962825729a211e093fd615ddc9e5b0bec10bdCary Clark DBG_NAV_LOGD("framePtr=%p nodePtr=%p", framePtr, nodePtr); 1316bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins JNIEnv* env = JSC::Bindings::getJNIEnv(); 1317b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 1318b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 1319b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return; 1320b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block env->CallVoidMethod(javaObject.get(), m_javaGlue.m_sendMoveFocus, (jint) framePtr, (jint) nodePtr); 1321bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins checkException(env); 1322bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins} 1323bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins 132446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkvoid sendMoveMouse(WebCore::Frame* framePtr, WebCore::Node* nodePtr, int x, int y) 13258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOGD("framePtr=%p nodePtr=%p x=%d y=%d", framePtr, nodePtr, x, y); 13278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 1328b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 1329b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 1330b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return; 1331b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block env->CallVoidMethod(javaObject.get(), m_javaGlue.m_sendMoveMouse, reinterpret_cast<jint>(framePtr), reinterpret_cast<jint>(nodePtr), x, y); 13328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 13338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 133594f12574c74b11db011b994e462f64a112952a47Leon Scrogginsvoid sendMoveMouseIfLatest(bool clearTextEntry, bool stopPaintingCaret) 13368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!"); 13388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 1339b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 1340b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 1341b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return; 1342b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block env->CallVoidMethod(javaObject.get(), m_javaGlue.m_sendMoveMouseIfLatest, clearTextEntry, stopPaintingCaret); 13438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 13448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1346b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Blockvoid sendMotionUp(WebCore::Frame* framePtr, WebCore::Node* nodePtr, int x, int y) 13478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1348b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block DBG_NAV_LOGD("m_generation=%d framePtr=%p nodePtr=%p x=%d y=%d", m_generation, framePtr, nodePtr, x, y); 13498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(m_javaGlue.m_obj, "A WebView was not associated with this WebViewNative!"); 1350b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block 13518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 1352b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 1353b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 1354b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return; 1355b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block m_viewImpl->m_touchGeneration = ++m_generation; 1356b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block env->CallVoidMethod(javaObject.get(), m_javaGlue.m_sendMotionUp, m_generation, (jint) framePtr, (jint) nodePtr, x, y); 13578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 13588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid findNext(bool forward) 13618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1362f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark m_findOnPage.findNext(forward); 1363c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block scrollToCurrentMatch(); 13648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project viewInvalidate(); 13658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// With this call, WebView takes ownership of matches, and is responsible for 13688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// deleting it. 1369db17cf1782eab2488aab0933add6c79b21639c08Leon Scrogginsvoid setMatches(WTF::Vector<MatchInfo>* matches, jboolean sameAsLastSearch) 1370db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins{ 1371db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins // If this search is the same as the last one, check against the old 1372db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins // location to determine whether to scroll. If the same word is found 1373db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins // in the same place, then do not scroll. 1374db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins IntRect oldLocation; 1375c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block bool checkAgainstOldLocation = false; 1376db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins if (sameAsLastSearch && m_findOnPage.isCurrentLocationValid()) { 1377db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins oldLocation = m_findOnPage.currentMatchBounds(); 1378db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins checkAgainstOldLocation = true; 1379c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block } 1380db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins 1381f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark m_findOnPage.setMatches(matches); 1382db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins 1383c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block if (!checkAgainstOldLocation || oldLocation != m_findOnPage.currentMatchBounds()) 1384c67a79f4e1bc925d774dac03df5b964c841ddc9fSteve Block scrollToCurrentMatch(); 13858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project viewInvalidate(); 13868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1388afbc0998ef990403a8e17efb9a384a46707a328eLeon Scrogginsint currentMatchIndex() 1389afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins{ 1390afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins return m_findOnPage.currentMatchIndex(); 1391afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins} 1392afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins 139351c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scrogginsbool scrollBy(int dx, int dy) 13948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!"); 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 false; 1401b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block bool result = env->CallBooleanMethod(javaObject.get(), m_javaGlue.m_scrollBy, dx, dy, true); 14028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 140351c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins return result; 14048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1406f51a51f6ea307f4311a04aa865a42b233269540bChris Craikvoid setIsScrolling(bool isScrolling) 1407f51a51f6ea307f4311a04aa865a42b233269540bChris Craik{ 1408ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch#if USE(ACCELERATED_COMPOSITING) 1409ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch if (m_glWebViewState) 1410ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch m_glWebViewState->setIsScrolling(isScrolling); 1411ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch#endif 1412f51a51f6ea307f4311a04aa865a42b233269540bChris Craik} 1413f51a51f6ea307f4311a04aa865a42b233269540bChris Craik 141446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkbool hasCursorNode() 14158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedRoot* root = getFrameCache(DontAllowNewer); 14178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!root) { 14188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DBG_NAV_LOG("!root"); 14198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 14208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 142146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark const CachedNode* cursorNode = root->currentCursor(); 142246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark DBG_NAV_LOGD("cursorNode=%d (nodePointer=%p)", 142346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark cursorNode ? cursorNode->index() : -1, 142446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark cursorNode ? cursorNode->nodePointer() : 0); 142546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return cursorNode; 142646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 142746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 142846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkbool hasFocusNode() 142946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 143046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark CachedRoot* root = getFrameCache(DontAllowNewer); 143146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark if (!root) { 143246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark DBG_NAV_LOG("!root"); 14338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 14348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 143546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark const CachedNode* focusNode = root->currentFocus(); 143646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark DBG_NAV_LOGD("focusNode=%d (nodePointer=%p)", 143746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark focusNode ? focusNode->index() : -1, 143846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark focusNode ? focusNode->nodePointer() : 0); 143946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return focusNode; 14408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 144295fa6e99128685c55e9be6f4362e67c288482a74Leon Scrogginsvoid rebuildWebTextView() 14438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 1445b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 1446b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 1447b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return; 1448b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block env->CallVoidMethod(javaObject.get(), m_javaGlue.m_rebuildWebTextView); 14498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 14508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid viewInvalidate() 14538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 1455b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 1456b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 1457b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return; 1458b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block env->CallVoidMethod(javaObject.get(), m_javaGlue.m_viewInvalidate); 14598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 14608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid viewInvalidateRect(int l, int t, int r, int b) 14638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 1465b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 1466b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 1467b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return; 1468b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block env->CallVoidMethod(javaObject.get(), m_javaGlue.m_viewInvalidateRect, l, r, t, b); 14698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 14708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid postInvalidateDelayed(int64_t delay, const WebCore::IntRect& bounds) 14738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 1475b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 1476b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 1477b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return; 1478b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block env->CallVoidMethod(javaObject.get(), m_javaGlue.m_postInvalidateDelayed, 14791ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block delay, bounds.x(), bounds.y(), bounds.maxX(), bounds.maxY()); 14808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 14818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14833deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenbergerbool inFullScreenMode() 14843deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger{ 14853deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger JNIEnv* env = JSC::Bindings::getJNIEnv(); 1486b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 1487b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 1488b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return false; 1489b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block jboolean result = env->CallBooleanMethod(javaObject.get(), m_javaGlue.m_inFullScreenMode); 14903deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger checkException(env); 14913deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger return result; 14923deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger} 14933deda57a53a7cfddfdb7a7d3eb3e781d454d7053Derek Sollenberger 149446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkint moveGeneration() 149546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 149646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return m_viewImpl->m_moveGeneration; 149746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 149846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 14996d43b9ceb777071c088fe12ee94af80e34816bcfGrace KlobaLayerAndroid* compositeRoot() const 1500f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{ 15016d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba LOG_ASSERT(!m_baseLayer || m_baseLayer->countChildren() == 1, 15026d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba "base layer can't have more than one child %s", __FUNCTION__); 15036d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba if (m_baseLayer && m_baseLayer->countChildren() == 1) 15046d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return static_cast<LayerAndroid*>(m_baseLayer->getChild(0)); 15056d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba else 15066d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return 0; 1507f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark} 1508f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark 150982f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL) 1510a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scottstatic void copyScrollPositionRecursive(const LayerAndroid* from, 1511a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott LayerAndroid* root) 1512a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{ 1513a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott if (!from || !root) 1514a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott return; 1515a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott for (int i = 0; i < from->countChildren(); i++) { 1516a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott const LayerAndroid* l = from->getChild(i); 1517a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott if (l->contentIsScrollable()) { 151882f247bdbb98dd80c44209d87692c650c3704617Patrick Scott const SkPoint& pos = l->getPosition(); 151982f247bdbb98dd80c44209d87692c650c3704617Patrick Scott LayerAndroid* match = root->findById(l->uniqueId()); 152082f247bdbb98dd80c44209d87692c650c3704617Patrick Scott if (match && match->contentIsScrollable()) 152182f247bdbb98dd80c44209d87692c650c3704617Patrick Scott match->setPosition(pos.fX, pos.fY); 1522a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott } 1523a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott copyScrollPositionRecursive(l, root); 1524a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott } 1525a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott} 152682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif 1527a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott 1528af33356e96e56310c66b47b6db913e1a61981ca3Chris Craikvoid registerPageSwapCallback() 1529af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik{ 1530af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik m_pageSwapCallbackRegistered = true; 1531af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik} 1532af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik 15336a3bd3f2b6b5a5c80e5fc1674550456b67e2cc7cShimeng (Simon) Wangvoid setBaseLayer(BaseLayerAndroid* layer, SkRegion& inval, bool showVisualIndicator, 153496eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik bool isPictureAfterFirstLayout, bool registerPageSwapCallback) 1535f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{ 1536a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING) 1537c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger if (m_glWebViewState) 15386a3bd3f2b6b5a5c80e5fc1674550456b67e2cc7cShimeng (Simon) Wang m_glWebViewState->setBaseLayer(layer, inval, showVisualIndicator, 15396a3bd3f2b6b5a5c80e5fc1674550456b67e2cc7cShimeng (Simon) Wang isPictureAfterFirstLayout); 154096eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik m_pageSwapCallbackRegistered |= registerPageSwapCallback; 1541a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif 1542a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 154382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL) 1544cf6e10e145f44cab3eb70f3782b51a92cf61ae7dShimeng (Simon) Wang if (layer) { 154582f247bdbb98dd80c44209d87692c650c3704617Patrick Scott LayerAndroid* newCompositeRoot = static_cast<LayerAndroid*>(layer->getChild(0)); 154682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott copyScrollPositionRecursive(compositeRoot(), newCompositeRoot); 1547cf6e10e145f44cab3eb70f3782b51a92cf61ae7dShimeng (Simon) Wang } 154882f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif 1549b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger SkSafeUnref(m_baseLayer); 15506d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba m_baseLayer = layer; 1551f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark CachedRoot* root = getFrameCache(DontAllowNewer); 1552f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark if (!root) 1553f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark return; 1554f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark root->resetLayers(); 15556d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba root->setRootLayer(compositeRoot()); 15566d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba} 15576d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba 15588111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reckvoid getTextSelectionRegion(SkRegion *region) 15598111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck{ 15600bab4025aed8786cb8307d2eede87f7f21cc0d65John Reck m_selectText.getSelectionRegion(getVisibleRect(), region, compositeRoot()); 15618111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck} 15628111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck 15636d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobavoid replaceBaseContent(PictureSet* set) 15646d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{ 15656d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba if (!m_baseLayer) 15666d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return; 15676d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba m_baseLayer->setContent(*set); 15686d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba delete set; 15696d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba} 15706d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba 15716d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobavoid copyBaseContentToPicture(SkPicture* picture) 15726d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{ 15736d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba if (!m_baseLayer) 15746d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return; 15756d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba PictureSet* content = m_baseLayer->content(); 1576e59ed3e2c930c8eeed844aa0365e8285d956a8f2Nicolas Roard m_baseLayer->drawCanvas(picture->beginRecording(content->width(), content->height(), 15776d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba SkPicture::kUsePathBoundsForClip_RecordingFlag)); 15786d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba picture->endRecording(); 15796d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba} 15806d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba 15816d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobabool hasContent() { 15826d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba if (!m_baseLayer) 15836d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return false; 15846d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return !m_baseLayer->content()->isEmpty(); 1585f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark} 1586f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark 1587908703e420f4931f74527aaeb3d5faabdd66c28aChet Haasevoid setFunctor(Functor* functor) { 1588908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase delete m_glDrawFunctor; 1589908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase m_glDrawFunctor = functor; 1590908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase} 1591908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase 1592908703e420f4931f74527aaeb3d5faabdd66c28aChet HaaseFunctor* getFunctor() { 1593908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase return m_glDrawFunctor; 1594908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase} 1595908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase 15964212fae38ffee2bbb657dd19e4ae8b7c735f4953John ReckBaseLayerAndroid* getBaseLayer() { 15974212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck return m_baseLayer; 15984212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck} 15994212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck 16008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate: // local state for WebView 16018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // private to getFrameCache(); other functions operate in a different thread 16028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedRoot* m_frameCacheUI; // navigation data ready for use 16038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebViewCore* m_viewImpl; 16048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int m_generation; // associate unique ID with sent kit focus to match with ui 16058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SkPicture* m_navPictureUI; 16068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SkMSec m_ringAnimationEnd; 16078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Corresponds to the same-named boolean on the java side. 16088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool m_heightCanMeasure; 16098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int m_lastDx; 16108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SkMSec m_lastDxTime; 161187962ce00229855c098ba12cee8d5c015a835289Cary Clark SelectText m_selectText; 1612f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark FindOnPage m_findOnPage; 161387962ce00229855c098ba12cee8d5c015a835289Cary Clark CursorRing m_ring; 16146d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba BaseLayerAndroid* m_baseLayer; 1615908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase Functor* m_glDrawFunctor; 1616a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING) 1617c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger GLWebViewState* m_glWebViewState; 161896eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik bool m_pageSwapCallbackRegistered; 1619a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif 1620ce03c1c1203621e552d41a8b3831837636f364a9Ben Murdoch RenderSkinButton* m_buttonSkin; 16218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; // end of WebView class 16228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1623908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase 1624908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase/** 1625908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * This class holds a function pointer and parameters for calling drawGL into a specific 1626908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * viewport. The pointer to the Functor will be put on a framework display list to be called 1627908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * when the display list is replayed. 1628908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase */ 1629908703e420f4931f74527aaeb3d5faabdd66c28aChet Haaseclass GLDrawFunctor : Functor { 1630908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase public: 1631908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase GLDrawFunctor(WebView* _wvInstance, 1632be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard bool(WebView::*_funcPtr)(WebCore::IntRect&, WebCore::IntRect*, WebCore::IntRect&, int, WebCore::IntRect&, jfloat, jint), 1633908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase WebCore::IntRect _viewRect, float _scale, int _extras) { 1634908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase wvInstance = _wvInstance; 1635908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase funcPtr = _funcPtr; 1636908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase viewRect = _viewRect; 1637908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase scale = _scale; 1638908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase extras = _extras; 1639908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase }; 164079d8e0434bfe00a793e8041f96dc02ec1d98e694Romain Guy status_t operator()(int messageId, void* data) { 164179d8e0434bfe00a793e8041f96dc02ec1d98e694Romain Guy if (viewRect.isEmpty()) { 1642821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase // NOOP operation if viewport is empty 1643821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase return 0; 1644821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase } 164579d8e0434bfe00a793e8041f96dc02ec1d98e694Romain Guy 16469f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard WebCore::IntRect inval; 16479f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard int titlebarHeight = webViewRect.height() - viewRect.height(); 1648b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner 1649b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner uirenderer::DrawGlInfo* info = reinterpret_cast<uirenderer::DrawGlInfo*>(data); 1650b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner WebCore::IntRect localViewRect = viewRect; 1651b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner if (info->isLayer) 1652b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner localViewRect.move(-1 * localViewRect.x(), -1 * localViewRect.y()); 1653b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner 1654be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard WebCore::IntRect clip(info->clipLeft, info->clipTop, 1655be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard info->clipRight - info->clipLeft, 1656be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard info->clipBottom - info->clipTop); 1657be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard 1658be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard bool retVal = (*wvInstance.*funcPtr)(localViewRect, &inval, webViewRect, titlebarHeight, clip, scale, extras); 1659b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy if (retVal) { 16609f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard IntRect finalInval; 16619f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard if (inval.isEmpty()) { 16629f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard finalInval = webViewRect; 1663be25f896a5c754e96c6c0d4719a79d523293d40fNicolas Roard retVal = true; 16649f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard } else { 16659f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard finalInval.setX(webViewRect.x() + inval.x()); 1666be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard finalInval.setY(webViewRect.y() + titlebarHeight + inval.y()); 16679f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard finalInval.setWidth(inval.width()); 16689f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard finalInval.setHeight(inval.height()); 16699f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard } 1670d1f5cf1ad8b20860bd9cb34a483451019124d1f9Romain Guy info->dirtyLeft = finalInval.x(); 1671d1f5cf1ad8b20860bd9cb34a483451019124d1f9Romain Guy info->dirtyTop = finalInval.y(); 16721ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block info->dirtyRight = finalInval.maxX(); 16731ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block info->dirtyBottom = finalInval.maxY(); 1674b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy } 1675908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase // return 1 if invalidation needed, 0 otherwise 1676908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase return retVal ? 1 : 0; 1677908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase } 1678908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase void updateRect(WebCore::IntRect& _viewRect) { 1679908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase viewRect = _viewRect; 1680908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase } 1681b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy void updateViewRect(WebCore::IntRect& _viewRect) { 1682b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy webViewRect = _viewRect; 1683b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy } 1684908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase private: 1685908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase WebView* wvInstance; 1686be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard bool (WebView::*funcPtr)(WebCore::IntRect&, WebCore::IntRect*, WebCore::IntRect&, int, WebCore::IntRect&, float, int); 1687908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase WebCore::IntRect viewRect; 1688b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy WebCore::IntRect webViewRect; 1689908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase jfloat scale; 1690908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase jint extras; 1691908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}; 1692908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase 1693040d9e4815004690561231442e069cc67cba600fChris Craikstatic jobject createJavaRect(JNIEnv* env, int x, int y, int right, int bottom) 1694040d9e4815004690561231442e069cc67cba600fChris Craik{ 1695040d9e4815004690561231442e069cc67cba600fChris Craik jclass rectClass = env->FindClass("android/graphics/Rect"); 1696040d9e4815004690561231442e069cc67cba600fChris Craik jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V"); 1697040d9e4815004690561231442e069cc67cba600fChris Craik jobject rect = env->NewObject(rectClass, init, x, y, right, bottom); 1698040d9e4815004690561231442e069cc67cba600fChris Craik env->DeleteLocalRef(rectClass); 1699040d9e4815004690561231442e069cc67cba600fChris Craik return rect; 1700040d9e4815004690561231442e069cc67cba600fChris Craik} 1701040d9e4815004690561231442e069cc67cba600fChris Craik 17028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 17038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Native JNI methods 17048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 1705d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkstatic int nativeCacheHitFramePointer(JNIEnv *env, jobject obj) 1706d4924af12855cd19162ba1442a6055664c98ca32Cary Clark{ 1707d4924af12855cd19162ba1442a6055664c98ca32Cary Clark return reinterpret_cast<int>(GET_NATIVE_VIEW(env, obj) 1708d4924af12855cd19162ba1442a6055664c98ca32Cary Clark ->m_cacheHitFrame->framePointer()); 1709d4924af12855cd19162ba1442a6055664c98ca32Cary Clark} 1710d4924af12855cd19162ba1442a6055664c98ca32Cary Clark 1711d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkstatic jobject nativeCacheHitNodeBounds(JNIEnv *env, jobject obj) 1712d4924af12855cd19162ba1442a6055664c98ca32Cary Clark{ 1713d4924af12855cd19162ba1442a6055664c98ca32Cary Clark WebCore::IntRect bounds = GET_NATIVE_VIEW(env, obj) 1714d4924af12855cd19162ba1442a6055664c98ca32Cary Clark ->m_cacheHitNode->originalAbsoluteBounds(); 1715040d9e4815004690561231442e069cc67cba600fChris Craik return createJavaRect(env, bounds.x(), bounds.y(), 1716040d9e4815004690561231442e069cc67cba600fChris Craik bounds.maxX(), bounds.maxY()); 1717d4924af12855cd19162ba1442a6055664c98ca32Cary Clark} 1718d4924af12855cd19162ba1442a6055664c98ca32Cary Clark 1719d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkstatic int nativeCacheHitNodePointer(JNIEnv *env, jobject obj) 1720d4924af12855cd19162ba1442a6055664c98ca32Cary Clark{ 1721d4924af12855cd19162ba1442a6055664c98ca32Cary Clark return reinterpret_cast<int>(GET_NATIVE_VIEW(env, obj) 1722d4924af12855cd19162ba1442a6055664c98ca32Cary Clark ->m_cacheHitNode->nodePointer()); 1723d4924af12855cd19162ba1442a6055664c98ca32Cary Clark} 1724d4924af12855cd19162ba1442a6055664c98ca32Cary Clark 1725b57c3a124715a89ac026e86f4fd3890529525d11Cary Clarkstatic bool nativeCacheHitIsPlugin(JNIEnv *env, jobject obj) 1726b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark{ 1727b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark return GET_NATIVE_VIEW(env, obj)->m_cacheHitNode->isPlugin(); 1728b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark} 1729b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark 1730c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clarkstatic void nativeClearCursor(JNIEnv *env, jobject obj) 17318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 17328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 17338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 1734c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark view->clearCursor(); 17358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1737ce03c1c1203621e552d41a8b3831837636f364a9Ben Murdochstatic void nativeCreate(JNIEnv *env, jobject obj, int viewImpl, jstring drawableDir) 17388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 17394de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins WTF::String dir = jstringToWtfString(env, drawableDir); 1740ce03c1c1203621e552d41a8b3831837636f364a9Ben Murdoch WebView* webview = new WebView(env, obj, viewImpl, dir); 17418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // NEED THIS OR SOMETHING LIKE IT! 17428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project //Release(obj); 17438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 174546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jint nativeCursorFramePointer(JNIEnv *env, jobject obj) 174646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 174746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark WebView* view = GET_NATIVE_VIEW(env, obj); 174846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer); 174946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark if (!root) 175046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return 0; 175146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark const CachedFrame* frame = 0; 175246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void) root->currentCursor(&frame); 175346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return reinterpret_cast<int>(frame ? frame->framePointer() : 0); 175446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 175546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 175646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic const CachedNode* getCursorNode(JNIEnv *env, jobject obj) 175746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 175846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark WebView* view = GET_NATIVE_VIEW(env, obj); 175946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer); 176046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return root ? root->currentCursor() : 0; 176146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 176246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 17631d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clarkstatic const CachedNode* getCursorNode(JNIEnv *env, jobject obj, 17641d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark const CachedFrame** frame) 17651d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark{ 17661d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark WebView* view = GET_NATIVE_VIEW(env, obj); 17671d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer); 17681d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark return root ? root->currentCursor(frame) : 0; 17691d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark} 17701d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark 1771f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clarkstatic const CachedNode* getFocusCandidate(JNIEnv *env, jobject obj, 1772f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedFrame** frame) 1773f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark{ 1774f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark WebView* view = GET_NATIVE_VIEW(env, obj); 1775f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer); 1776f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark if (!root) 1777f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark return 0; 1778f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedNode* cursor = root->currentCursor(frame); 1779f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark if (cursor && cursor->wantsKeyEvents()) 1780f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark return cursor; 17814ca469897f8dc36063e262faccefe4b8eacb9e7bCary Clark return root->currentFocus(frame); 1782f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark} 1783f886bc57020d37942e84b74ff878bdc1498a09c7Cary Clark 17842194b17e89b2ad4c0624f7612e417db6d69150adLeon Scrogginsstatic bool focusCandidateHasNextTextfield(JNIEnv *env, jobject obj) 17852194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins{ 178665966ae193adfef8d40419ad9c11515b0e56f257Cary Clark WebView* view = GET_NATIVE_VIEW(env, obj); 178765966ae193adfef8d40419ad9c11515b0e56f257Cary Clark CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer); 178865966ae193adfef8d40419ad9c11515b0e56f257Cary Clark if (!root) 178965966ae193adfef8d40419ad9c11515b0e56f257Cary Clark return false; 179065966ae193adfef8d40419ad9c11515b0e56f257Cary Clark const CachedNode* cursor = root->currentCursor(); 179165966ae193adfef8d40419ad9c11515b0e56f257Cary Clark if (!cursor || !cursor->isTextInput()) 179265966ae193adfef8d40419ad9c11515b0e56f257Cary Clark cursor = root->currentFocus(); 17932194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins if (!cursor || !cursor->isTextInput()) return false; 179465966ae193adfef8d40419ad9c11515b0e56f257Cary Clark return root->nextTextField(cursor, 0); 17952194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins} 17962194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins 179746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic const CachedNode* getFocusNode(JNIEnv *env, jobject obj) 179846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 179946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark WebView* view = GET_NATIVE_VIEW(env, obj); 180046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer); 180146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return root ? root->currentFocus() : 0; 180246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 180346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 18048026280044128436d8e89736519a0b32b6540201Cary Clarkstatic const CachedNode* getFocusNode(JNIEnv *env, jobject obj, 18058026280044128436d8e89736519a0b32b6540201Cary Clark const CachedFrame** frame) 18068026280044128436d8e89736519a0b32b6540201Cary Clark{ 18078026280044128436d8e89736519a0b32b6540201Cary Clark WebView* view = GET_NATIVE_VIEW(env, obj); 18088026280044128436d8e89736519a0b32b6540201Cary Clark CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer); 18098026280044128436d8e89736519a0b32b6540201Cary Clark return root ? root->currentFocus(frame) : 0; 18108026280044128436d8e89736519a0b32b6540201Cary Clark} 18118026280044128436d8e89736519a0b32b6540201Cary Clark 18121d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clarkstatic const CachedInput* getInputCandidate(JNIEnv *env, jobject obj) 18131d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark{ 18141d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark WebView* view = GET_NATIVE_VIEW(env, obj); 18151d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer); 18161d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark if (!root) 18171d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark return 0; 18181d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark const CachedFrame* frame; 18191d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark const CachedNode* cursor = root->currentCursor(&frame); 18201d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark if (!cursor || !cursor->wantsKeyEvents()) 18211d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark cursor = root->currentFocus(&frame); 18221d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark return cursor ? frame->textInput(cursor) : 0; 18231d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark} 18241d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark 18251cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scrogginsstatic jboolean nativePageShouldHandleShiftAndArrows(JNIEnv *env, jobject obj) 18261cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins{ 18271cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins const CachedNode* focus = getFocusNode(env, obj); 18281cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins if (!focus) return false; 18291cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins // Plugins handle shift and arrows whether or not they have focus. 18301cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins if (focus->isPlugin()) return true; 18311cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins const CachedNode* cursor = getCursorNode(env, obj); 18321cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins // ContentEditable nodes should only receive shift and arrows if they have 18331cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins // both the cursor and the focus. 18341cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins return cursor && cursor->nodePointer() == focus->nodePointer() 18351cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins && cursor->isContentEditable(); 18361cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins} 18371cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins 183846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jobject nativeCursorNodeBounds(JNIEnv *env, jobject obj) 183946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 1840f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedFrame* frame; 1841f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedNode* node = getCursorNode(env, obj, &frame); 1842f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark WebCore::IntRect bounds = node ? node->bounds(frame) 184346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark : WebCore::IntRect(0, 0, 0, 0); 1844040d9e4815004690561231442e069cc67cba600fChris Craik return createJavaRect(env, bounds.x(), bounds.y(), 1845040d9e4815004690561231442e069cc67cba600fChris Craik bounds.maxX(), bounds.maxY()); 184646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 184746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 184846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jint nativeCursorNodePointer(JNIEnv *env, jobject obj) 184946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 185046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark const CachedNode* node = getCursorNode(env, obj); 185146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return reinterpret_cast<int>(node ? node->nodePointer() : 0); 185246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 185346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 185436747fa778285f57f2f53c047028be83e9d8776dCary Clarkstatic jobject nativeCursorPosition(JNIEnv *env, jobject obj) 185536747fa778285f57f2f53c047028be83e9d8776dCary Clark{ 185636747fa778285f57f2f53c047028be83e9d8776dCary Clark WebView* view = GET_NATIVE_VIEW(env, obj); 18570181faa1ffede024c2712df19ae7c855a8cf64e3Cary Clark const CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer); 185836747fa778285f57f2f53c047028be83e9d8776dCary Clark WebCore::IntPoint pos = WebCore::IntPoint(0, 0); 185936747fa778285f57f2f53c047028be83e9d8776dCary Clark if (root) 186019194ea29920c2f7a02d08dfb0416608bc81dbb7Leon Scroggins root->getSimulatedMousePosition(&pos); 186136747fa778285f57f2f53c047028be83e9d8776dCary Clark jclass pointClass = env->FindClass("android/graphics/Point"); 186236747fa778285f57f2f53c047028be83e9d8776dCary Clark jmethodID init = env->GetMethodID(pointClass, "<init>", "(II)V"); 186336747fa778285f57f2f53c047028be83e9d8776dCary Clark jobject point = env->NewObject(pointClass, init, pos.x(), pos.y()); 1864bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block env->DeleteLocalRef(pointClass); 186536747fa778285f57f2f53c047028be83e9d8776dCary Clark return point; 186636747fa778285f57f2f53c047028be83e9d8776dCary Clark} 186736747fa778285f57f2f53c047028be83e9d8776dCary Clark 186846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic WebCore::IntRect jrect_to_webrect(JNIEnv* env, jobject obj) 186946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 187046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark int L, T, R, B; 187146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark GraphicsJNI::get_jrect(env, obj, &L, &T, &R, &B); 187246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return WebCore::IntRect(L, T, R - L, B - T); 187346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 187446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 187546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic bool nativeCursorIntersects(JNIEnv *env, jobject obj, jobject visRect) 187646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 1877f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedFrame* frame; 1878f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedNode* node = getCursorNode(env, obj, &frame); 1879f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark return node ? node->bounds(frame).intersects( 1880f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark jrect_to_webrect(env, visRect)) : false; 188146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 188246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 188346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic bool nativeCursorIsAnchor(JNIEnv *env, jobject obj) 188446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 188546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark const CachedNode* node = getCursorNode(env, obj); 188646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return node ? node->isAnchor() : false; 188746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 188846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 188946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic bool nativeCursorIsTextInput(JNIEnv *env, jobject obj) 189046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 189146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark const CachedNode* node = getCursorNode(env, obj); 18921d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark return node ? node->isTextInput() : false; 189346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 189446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 189546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jobject nativeCursorText(JNIEnv *env, jobject obj) 189646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 189746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark const CachedNode* node = getCursorNode(env, obj); 189846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark if (!node) 189946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return 0; 190045b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch WTF::String value = node->getExport(); 190179b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block return wtfStringToJstring(env, value); 190246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 190346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 19048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeDebugDump(JNIEnv *env, jobject obj) 19058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 19068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if DUMP_NAV_CACHE 19078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 19088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 19098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view->debugDump(); 19108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 19118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 19128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19136d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic jint nativeDraw(JNIEnv *env, jobject obj, jobject canv, jint color, 19146d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba jint extras, jboolean split) { 19158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SkCanvas* canvas = GraphicsJNI::getNativeCanvas(env, canv); 19166d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return reinterpret_cast<jint>(GET_NATIVE_VIEW(env, obj)->draw(canvas, color, extras, split)); 19178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 19188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1919223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reckstatic jint nativeGetDrawGLFunction(JNIEnv *env, jobject obj, jint nativeView, 1920223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck jobject jrect, jobject jviewrect, 1921223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck jfloat scale, jint extras) { 1922821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase WebCore::IntRect viewRect; 1923821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase if (jrect == NULL) { 1924821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase viewRect = WebCore::IntRect(); 1925821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase } else { 1926821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase viewRect = jrect_to_webrect(env, jrect); 1927821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase } 1928223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck WebView *wvInstance = (WebView*) nativeView; 1929908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase GLDrawFunctor* functor = new GLDrawFunctor(wvInstance, &android::WebView::drawGL, 1930908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase viewRect, scale, extras); 1931908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase wvInstance->setFunctor((Functor*) functor); 1932b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy 1933b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy WebCore::IntRect webViewRect; 1934b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy if (jviewrect == NULL) { 1935b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy webViewRect = WebCore::IntRect(); 1936b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy } else { 1937b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy webViewRect = jrect_to_webrect(env, jviewrect); 1938b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy } 1939b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy functor->updateViewRect(webViewRect); 1940b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy 1941908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase return (jint)functor; 1942908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase} 1943908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase 1944b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guystatic void nativeUpdateDrawGLFunction(JNIEnv *env, jobject obj, jobject jrect, jobject jviewrect) { 1945908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase WebView *wvInstance = GET_NATIVE_VIEW(env, obj); 1946908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase if (wvInstance != NULL) { 1947908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase GLDrawFunctor* functor = (GLDrawFunctor*) wvInstance->getFunctor(); 1948908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase if (functor != NULL) { 1949821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase WebCore::IntRect viewRect; 1950821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase if (jrect == NULL) { 1951821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase viewRect = WebCore::IntRect(); 1952821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase } else { 1953821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase viewRect = jrect_to_webrect(env, jrect); 1954821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase } 1955908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase functor->updateRect(viewRect); 1956b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy 1957b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy WebCore::IntRect webViewRect; 1958b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy if (jviewrect == NULL) { 1959b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy webViewRect = WebCore::IntRect(); 1960b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy } else { 1961b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy webViewRect = jrect_to_webrect(env, jviewrect); 1962b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy } 1963b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy functor->updateViewRect(webViewRect); 1964908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase } 1965908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase } 1966908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase} 1967908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase 1968223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reckstatic bool nativeEvaluateLayersAnimations(JNIEnv *env, jobject obj, jint nativeView) 1969797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{ 1970797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#if USE(ACCELERATED_COMPOSITING) 1971223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck LayerAndroid* root = ((WebView*)nativeView)->compositeRoot(); 197287962ce00229855c098ba12cee8d5c015a835289Cary Clark if (root) 197387962ce00229855c098ba12cee8d5c015a835289Cary Clark return root->evaluateAnimations(); 1974797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#endif 1975797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard return false; 1976797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard} 1977797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 197867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roardstatic void nativeSetBaseLayer(JNIEnv *env, jobject obj, jint layer, jobject inval, 19796a3bd3f2b6b5a5c80e5fc1674550456b67e2cc7cShimeng (Simon) Wang jboolean showVisualIndicator, 198096eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik jboolean isPictureAfterFirstLayout, 198196eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik jboolean registerPageSwapCallback) 1982f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{ 19836d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba BaseLayerAndroid* layerImpl = reinterpret_cast<BaseLayerAndroid*>(layer); 198467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard SkRegion invalRegion; 198567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (inval) 198667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard invalRegion = *GraphicsJNI::getNativeRegion(env, inval); 19876a3bd3f2b6b5a5c80e5fc1674550456b67e2cc7cShimeng (Simon) Wang GET_NATIVE_VIEW(env, obj)->setBaseLayer(layerImpl, invalRegion, showVisualIndicator, 198896eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik isPictureAfterFirstLayout, 198996eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik registerPageSwapCallback); 19906d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba} 19916d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba 19928111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reckstatic void nativeGetTextSelectionRegion(JNIEnv *env, jobject obj, jobject region) 19938111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck{ 19948111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck if (!region) 19958111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck return; 19968111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck SkRegion* nregion = GraphicsJNI::getNativeRegion(env, region); 19978111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck GET_NATIVE_VIEW(env, obj)->getTextSelectionRegion(nregion); 19988111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck} 19998111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck 20004212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reckstatic BaseLayerAndroid* nativeGetBaseLayer(JNIEnv *env, jobject obj) 20014212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck{ 20024212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck return GET_NATIVE_VIEW(env, obj)->getBaseLayer(); 20034212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck} 20044212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck 20056d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic void nativeReplaceBaseContent(JNIEnv *env, jobject obj, jint content) 20066d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{ 20076d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba PictureSet* set = reinterpret_cast<PictureSet*>(content); 20086d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba GET_NATIVE_VIEW(env, obj)->replaceBaseContent(set); 20096d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba} 20106d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba 20116d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic void nativeCopyBaseContentToPicture(JNIEnv *env, jobject obj, jobject pict) 20126d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{ 20136d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba SkPicture* picture = GraphicsJNI::getNativePicture(env, pict); 20146d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba GET_NATIVE_VIEW(env, obj)->copyBaseContentToPicture(picture); 20156d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba} 20166d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba 20176d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic bool nativeHasContent(JNIEnv *env, jobject obj) 20186d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{ 20196d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return GET_NATIVE_VIEW(env, obj)->hasContent(); 2020f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark} 2021f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark 20228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jobject nativeImageURI(JNIEnv *env, jobject obj, jint x, jint y) 20238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 20248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 20258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 202645b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch WTF::String uri = view->imageURI(x, y); 202779b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block return wtfStringToJstring(env, uri); 20288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 20298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 203049e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clarkstatic jint nativeFocusCandidateFramePointer(JNIEnv *env, jobject obj) 203149e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark{ 203249e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark WebView* view = GET_NATIVE_VIEW(env, obj); 203349e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer); 203449e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark if (!root) 203549e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark return 0; 203649e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark const CachedFrame* frame = 0; 203749e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark const CachedNode* cursor = root->currentCursor(&frame); 203849e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark if (!cursor || !cursor->wantsKeyEvents()) 203949e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark (void) root->currentFocus(&frame); 204049e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark return reinterpret_cast<int>(frame ? frame->framePointer() : 0); 204149e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark} 204249e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark 2043bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic bool nativeFocusCandidateIsPassword(JNIEnv *env, jobject obj) 204446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 20451d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark const CachedInput* input = getInputCandidate(env, obj); 2046737a377f81baa2bf868b48f3457cc9a53cea2e6eBen Murdoch return input && input->getType() == CachedInput::PASSWORD; 204746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 204846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 2049bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic bool nativeFocusCandidateIsRtlText(JNIEnv *env, jobject obj) 205046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 20511d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark const CachedInput* input = getInputCandidate(env, obj); 20521d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark return input ? input->isRtlText() : false; 205346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 205446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 2055bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic bool nativeFocusCandidateIsTextInput(JNIEnv *env, jobject obj) 205646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 2057f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedNode* node = getFocusCandidate(env, obj, 0); 20581d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark return node ? node->isTextInput() : false; 205946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 206046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 2061bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic jint nativeFocusCandidateMaxLength(JNIEnv *env, jobject obj) 206246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 20631d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark const CachedInput* input = getInputCandidate(env, obj); 20641d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark return input ? input->maxLength() : false; 206546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 206646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 2067ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scrogginsstatic jint nativeFocusCandidateIsAutoComplete(JNIEnv *env, jobject obj) 2068ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins{ 2069ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins const CachedInput* input = getInputCandidate(env, obj); 2070ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins return input ? input->autoComplete() : false; 2071ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins} 2072ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins 2073bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic jobject nativeFocusCandidateName(JNIEnv *env, jobject obj) 207446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 20751d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark const CachedInput* input = getInputCandidate(env, obj); 20761d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark if (!input) 207746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return 0; 207845b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch const WTF::String& name = input->name(); 207979b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block return wtfStringToJstring(env, name); 208046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 208146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 2082bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic jobject nativeFocusCandidateNodeBounds(JNIEnv *env, jobject obj) 208346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 2084f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedFrame* frame; 2085f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedNode* node = getFocusCandidate(env, obj, &frame); 2086f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark WebCore::IntRect bounds = node ? node->bounds(frame) 208746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark : WebCore::IntRect(0, 0, 0, 0); 2088040d9e4815004690561231442e069cc67cba600fChris Craik // Inset the rect by 1 unit, so that the focus candidate's border can still 2089040d9e4815004690561231442e069cc67cba600fChris Craik // be seen behind it. 2090040d9e4815004690561231442e069cc67cba600fChris Craik return createJavaRect(env, bounds.x() + 1, bounds.y() + 1, 2091040d9e4815004690561231442e069cc67cba600fChris Craik bounds.maxX() - 1, bounds.maxY() - 1); 2092390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins} 2093390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins 2094390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scrogginsstatic jobject nativeFocusCandidatePaddingRect(JNIEnv *env, jobject obj) 2095390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins{ 2096390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins const CachedInput* input = getInputCandidate(env, obj); 2097390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins if (!input) 2098390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins return 0; 2099390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins // Note that the Java Rect is being used to pass four integers, rather than 2100390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins // being used as an actual rectangle. 2101390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins return createJavaRect(env, input->paddingLeft(), input->paddingTop(), 2102390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins input->paddingRight(), input->paddingBottom()); 210346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 210446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 2105bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic jint nativeFocusCandidatePointer(JNIEnv *env, jobject obj) 210646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 2107f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedNode* node = getFocusCandidate(env, obj, 0); 210846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return reinterpret_cast<int>(node ? node->nodePointer() : 0); 210946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 211046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 211185e3844824444f304a15e57f62d2e5670fb3bf47Michael Kolbstatic jint nativeFocusCandidateIsSpellcheck(JNIEnv *env, jobject obj) 211285e3844824444f304a15e57f62d2e5670fb3bf47Michael Kolb{ 211385e3844824444f304a15e57f62d2e5670fb3bf47Michael Kolb const CachedInput* input = getInputCandidate(env, obj); 211485e3844824444f304a15e57f62d2e5670fb3bf47Michael Kolb return input ? input->spellcheck() : false; 211585e3844824444f304a15e57f62d2e5670fb3bf47Michael Kolb} 211685e3844824444f304a15e57f62d2e5670fb3bf47Michael Kolb 2117bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic jobject nativeFocusCandidateText(JNIEnv *env, jobject obj) 211846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 2119f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const CachedNode* node = getFocusCandidate(env, obj, 0); 212046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark if (!node) 212146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return 0; 212245b64f60af3cbfa8c78388e35e9b669a0c284bdcBen Murdoch WTF::String value = node->getExport(); 212379b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block return wtfStringToJstring(env, value); 212446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 212546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 2126d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scrogginsstatic int nativeFocusCandidateLineHeight(JNIEnv *env, jobject obj) 2127d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins{ 2128d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins const CachedInput* input = getInputCandidate(env, obj); 2129d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins return input ? input->lineHeight() : 0; 2130d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins} 2131d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins 21323a3b28707d2d6a06afe9f3137e9bedc07246d600Leon Scrogginsstatic jfloat nativeFocusCandidateTextSize(JNIEnv *env, jobject obj) 213346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 21341d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark const CachedInput* input = getInputCandidate(env, obj); 21353a3b28707d2d6a06afe9f3137e9bedc07246d600Leon Scroggins return input ? input->textSize() : 0.f; 213646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 213746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 213874757b62fce144f27c25cc7744df82cd7411b2dcLeon Scrogginsstatic int nativeFocusCandidateType(JNIEnv *env, jobject obj) 213974757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins{ 214074757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins const CachedInput* input = getInputCandidate(env, obj); 214141c8cd06bd25769654e321d1222856182ebad067Ben Murdoch if (!input) 2142737a377f81baa2bf868b48f3457cc9a53cea2e6eBen Murdoch return CachedInput::NONE; 214341c8cd06bd25769654e321d1222856182ebad067Ben Murdoch 214441c8cd06bd25769654e321d1222856182ebad067Ben Murdoch if (input->isTextArea()) 2145737a377f81baa2bf868b48f3457cc9a53cea2e6eBen Murdoch return CachedInput::TEXT_AREA; 2146737a377f81baa2bf868b48f3457cc9a53cea2e6eBen Murdoch 2147737a377f81baa2bf868b48f3457cc9a53cea2e6eBen Murdoch return input->getType(); 214874757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins} 214974757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins 2150c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenbergerstatic bool nativeFocusIsPlugin(JNIEnv *env, jobject obj) 2151c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger{ 2152c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger const CachedNode* node = getFocusNode(env, obj); 2153c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger return node ? node->isPlugin() : false; 2154c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger} 2155c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger 21568026280044128436d8e89736519a0b32b6540201Cary Clarkstatic jobject nativeFocusNodeBounds(JNIEnv *env, jobject obj) 21578026280044128436d8e89736519a0b32b6540201Cary Clark{ 21588026280044128436d8e89736519a0b32b6540201Cary Clark const CachedFrame* frame; 21598026280044128436d8e89736519a0b32b6540201Cary Clark const CachedNode* node = getFocusNode(env, obj, &frame); 21608026280044128436d8e89736519a0b32b6540201Cary Clark WebCore::IntRect bounds = node ? node->bounds(frame) 21618026280044128436d8e89736519a0b32b6540201Cary Clark : WebCore::IntRect(0, 0, 0, 0); 2162040d9e4815004690561231442e069cc67cba600fChris Craik return createJavaRect(env, bounds.x(), bounds.y(), 2163040d9e4815004690561231442e069cc67cba600fChris Craik bounds.maxX(), bounds.maxY()); 21648026280044128436d8e89736519a0b32b6540201Cary Clark} 21658026280044128436d8e89736519a0b32b6540201Cary Clark 2166539427bc7572dfd8b28579c67460186406dcb246Leon Scrogginsstatic jint nativeFocusNodePointer(JNIEnv *env, jobject obj) 2167539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins{ 2168539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins const CachedNode* node = getFocusNode(env, obj); 2169539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins return node ? reinterpret_cast<int>(node->nodePointer()) : 0; 2170539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins} 2171539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins 2172f4669cac3858848a9247e801b6106aeae6d406e8Cary Clarkstatic bool nativeCursorWantsKeyEvents(JNIEnv* env, jobject jwebview) { 21738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, jwebview); 21748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 2175f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark return view->cursorWantsKeyEvents(); 21768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2178c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clarkstatic void nativeHideCursor(JNIEnv *env, jobject obj) 2179c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark{ 2180c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark WebView* view = GET_NATIVE_VIEW(env, obj); 2181c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 2182c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark view->hideCursor(); 2183c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark} 2184c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark 21858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeInstrumentReport(JNIEnv *env, jobject obj) 21868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_INSTRUMENT 21888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project TimeCounter::reportNow(); 21898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 21908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeSelectBestAt(JNIEnv *env, jobject obj, jobject jrect) 21938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 21958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 21968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebCore::IntRect rect = jrect_to_webrect(env, jrect); 21978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view->selectBestAt(rect); 21988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22001b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganovstatic void nativeSelectAt(JNIEnv *env, jobject obj, jint x, jint y) 22011b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov{ 22021b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov WebView* view = GET_NATIVE_VIEW(env, obj); 22031b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 22041b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov WebCore::IntRect rect = IntRect(x, y , 1, 1); 22051b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov view->selectBestAt(rect); 22061b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov if (view->hasCursorNode()) 22071b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov view->showCursorUntimed(); 22081b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov} 22091b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov 22109092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clarkstatic jobject nativeLayerBounds(JNIEnv* env, jobject obj, jint jlayer) 22119092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark{ 22129092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark SkRect r; 22139092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark#if USE(ACCELERATED_COMPOSITING) 22149092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark LayerAndroid* layer = (LayerAndroid*) jlayer; 22159092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark r = layer->bounds(); 22169092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark#else 22179092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark r.setEmpty(); 22189092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark#endif 22199092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark SkIRect irect; 22209092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark r.round(&irect); 22219092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark jclass rectClass = env->FindClass("android/graphics/Rect"); 22229092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V"); 22239092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark jobject rect = env->NewObject(rectClass, init, irect.fLeft, irect.fTop, 22249092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark irect.fRight, irect.fBottom); 22259092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark env->DeleteLocalRef(rectClass); 22269092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark return rect; 22279092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark} 22289092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark 2229cc4e3c422964c7d999e8f340057f303140d845ddCary Clarkstatic jobject nativeSubtractLayers(JNIEnv* env, jobject obj, jobject jrect) 2230cc4e3c422964c7d999e8f340057f303140d845ddCary Clark{ 2231cc4e3c422964c7d999e8f340057f303140d845ddCary Clark SkIRect irect = jrect_to_webrect(env, jrect); 2232cc4e3c422964c7d999e8f340057f303140d845ddCary Clark#if USE(ACCELERATED_COMPOSITING) 22336d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba LayerAndroid* root = GET_NATIVE_VIEW(env, obj)->compositeRoot(); 2234cc4e3c422964c7d999e8f340057f303140d845ddCary Clark if (root) { 2235cc4e3c422964c7d999e8f340057f303140d845ddCary Clark SkRect rect; 2236cc4e3c422964c7d999e8f340057f303140d845ddCary Clark rect.set(irect); 2237cc4e3c422964c7d999e8f340057f303140d845ddCary Clark rect = root->subtractLayers(rect); 2238cc4e3c422964c7d999e8f340057f303140d845ddCary Clark rect.round(&irect); 2239cc4e3c422964c7d999e8f340057f303140d845ddCary Clark } 2240cc4e3c422964c7d999e8f340057f303140d845ddCary Clark#endif 2241cc4e3c422964c7d999e8f340057f303140d845ddCary Clark jclass rectClass = env->FindClass("android/graphics/Rect"); 2242cc4e3c422964c7d999e8f340057f303140d845ddCary Clark jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V"); 2243bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block jobject rect = env->NewObject(rectClass, init, irect.fLeft, irect.fTop, 2244cc4e3c422964c7d999e8f340057f303140d845ddCary Clark irect.fRight, irect.fBottom); 2245bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block env->DeleteLocalRef(rectClass); 2246bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block return rect; 2247cc4e3c422964c7d999e8f340057f303140d845ddCary Clark} 2248cc4e3c422964c7d999e8f340057f303140d845ddCary Clark 224946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jint nativeTextGeneration(JNIEnv *env, jobject obj) 225046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 225146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark WebView* view = GET_NATIVE_VIEW(env, obj); 225246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer); 225346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return root ? root->textGeneration() : 0; 225446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 225546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 2256d4924af12855cd19162ba1442a6055664c98ca32Cary Clarkstatic bool nativePointInNavCache(JNIEnv *env, jobject obj, 2257d4924af12855cd19162ba1442a6055664c98ca32Cary Clark int x, int y, int slop) 2258d4924af12855cd19162ba1442a6055664c98ca32Cary Clark{ 2259d4924af12855cd19162ba1442a6055664c98ca32Cary Clark return GET_NATIVE_VIEW(env, obj)->pointInNavCache(x, y, slop); 2260d4924af12855cd19162ba1442a6055664c98ca32Cary Clark} 2261d4924af12855cd19162ba1442a6055664c98ca32Cary Clark 22628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool nativeMotionUp(JNIEnv *env, jobject obj, 2263d48434fc633d173b549b97b1c614072adc9648a8Cary Clark int x, int y, int slop) 22648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 22668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 226746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return view->motionUp(x, y, slop); 22688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 227046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic bool nativeHasCursorNode(JNIEnv *env, jobject obj) 22718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 227246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return GET_NATIVE_VIEW(env, obj)->hasCursorNode(); 22738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 227546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic bool nativeHasFocusNode(JNIEnv *env, jobject obj) 22768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 227746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark return GET_NATIVE_VIEW(env, obj)->hasFocusNode(); 22788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2280bc0656f7505db89baea5835febb882daf32f32a6Leon Scrogginsstatic bool nativeMoveCursor(JNIEnv *env, jobject obj, 228146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark int key, int count, bool ignoreScroll) 22828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 228446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark DBG_NAV_LOGD("env=%p obj=%p view=%p", env, obj, view); 22858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 22864ca8bc94f71466d1109bfbb9ef00da3256a0899bCary Clark return view->moveCursor(key, count, ignoreScroll); 22878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2289223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reckstatic void nativeRecordButtons(JNIEnv* env, jobject obj, jint nativeView, 2290223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck bool hasFocus, bool pressed, bool invalidate) 22918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2292223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck WebView* view = (WebView*) nativeView; 22938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 22948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view->nativeRecordButtons(hasFocus, pressed, invalidate); 22958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2297afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clarkstatic void nativeSetFindIsUp(JNIEnv *env, jobject obj, jboolean isUp) 22988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 23008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 2301afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark view->setFindIsUp(isUp); 2302afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark} 2303afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark 2304afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clarkstatic void nativeSetFindIsEmpty(JNIEnv *env, jobject obj) 2305afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark{ 2306afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark GET_NATIVE_VIEW(env, obj)->setFindIsEmpty(); 23078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 230932dffb883f56b18019afa7a01b2564b993b3fe8eCary Clarkstatic void nativeShowCursorTimed(JNIEnv *env, jobject obj) 23108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 231132dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark GET_NATIVE_VIEW(env, obj)->showCursorTimed(); 23128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeSetHeightCanMeasure(JNIEnv *env, jobject obj, bool measure) 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 nativeSetHeightCanMeasure"); 23188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view->setHeightCanMeasure(measure); 23198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 232146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic jobject nativeGetCursorRingBounds(JNIEnv *env, jobject obj) 23228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 23248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 23258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jclass rectClass = env->FindClass("android/graphics/Rect"); 23268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(rectClass, "Could not find Rect class!"); 23278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V"); 23288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(init, "Could not find constructor for Rect"); 23298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebCore::IntRect webRect; 233046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark view->cursorRingBounds(&webRect); 23318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jobject rect = env->NewObject(rectClass, init, webRect.x(), 23321ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block webRect.y(), webRect.maxX(), webRect.maxY()); 2333bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block env->DeleteLocalRef(rectClass); 23348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return rect; 23358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic int nativeFindAll(JNIEnv *env, jobject obj, jstring findLower, 2338db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins jstring findUpper, jboolean sameAsLastSearch) 23398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If one or the other is null, do not search. 23418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!(findLower && findUpper)) 23428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 23438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Obtain the characters for both the lower case string and the upper case 23448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // string representing the same word. 23458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const jchar* findLowerChars = env->GetStringChars(findLower, 0); 23468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const jchar* findUpperChars = env->GetStringChars(findUpper, 0); 23478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If one or the other is null, do not search. 23488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!(findLowerChars && findUpperChars)) { 23498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (findLowerChars) 23508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project env->ReleaseStringChars(findLower, findLowerChars); 23518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (findUpperChars) 23528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project env->ReleaseStringChars(findUpper, findUpperChars); 23538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 23548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 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 nativeFindAll"); 235846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark CachedRoot* root = view->getFrameCache(WebView::AllowNewer); 23598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!root) { 23608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project env->ReleaseStringChars(findLower, findLowerChars); 23618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project env->ReleaseStringChars(findUpper, findUpperChars); 23628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 23638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 23648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int length = env->GetStringLength(findLower); 23668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If the lengths of the strings do not match, then they are not the same 23678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // word, so do not search. 23688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!length || env->GetStringLength(findUpper) != length) { 23698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project env->ReleaseStringChars(findLower, findLowerChars); 23708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project env->ReleaseStringChars(findUpper, findUpperChars); 23718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 23728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 23738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int width = root->documentWidth(); 23758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int height = root->documentHeight(); 23768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Create a FindCanvas, which allows us to fake draw into it so we can 23778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // figure out where our search string is rendered (and how many times). 23788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FindCanvas canvas(width, height, (const UChar*) findLowerChars, 23798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (const UChar*) findUpperChars, length << 1); 23808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SkBitmap bitmap; 23818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bitmap.setConfig(SkBitmap::kARGB_8888_Config, width, height); 23828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project canvas.setBitmapDevice(bitmap); 2383f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark root->draw(canvas); 23848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WTF::Vector<MatchInfo>* matches = canvas.detachMatches(); 23858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // With setMatches, the WebView takes ownership of matches 2386db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins view->setMatches(matches, sameAsLastSearch); 23878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project env->ReleaseStringChars(findLower, findLowerChars); 23898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project env->ReleaseStringChars(findUpper, findUpperChars); 23908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 23918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return canvas.found(); 23928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeFindNext(JNIEnv *env, jobject obj, bool forward) 23958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 23978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in nativeFindNext"); 23988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view->findNext(forward); 23998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2401afbc0998ef990403a8e17efb9a384a46707a328eLeon Scrogginsstatic int nativeFindIndex(JNIEnv *env, jobject obj) 2402afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins{ 2403afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins WebView* view = GET_NATIVE_VIEW(env, obj); 2404afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins LOG_ASSERT(view, "view not set in nativeFindIndex"); 2405afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins return view->currentMatchIndex(); 2406afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins} 2407afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins 24088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeUpdateCachedTextfield(JNIEnv *env, jobject obj, jstring updatedText, jint generation) 24098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 24108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 24118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in nativeUpdateCachedTextfield"); 24128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer); 24138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!root) 24148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 24158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const CachedNode* cachedFocusNode = root->currentFocus(); 24161d330120b6c2ee2d3f1c25300d0e3d446ef8c640Cary Clark if (!cachedFocusNode || !cachedFocusNode->isTextInput()) 24178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 241827dd31673790eed64c3e0e508bb900671f06bcb3Steve Block WTF::String webcoreString = jstringToWtfString(env, updatedText); 24198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (const_cast<CachedNode*>(cachedFocusNode))->setExport(webcoreString); 24208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project root->setTextGeneration(generation); 24218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 24228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2424fa768f11d82c34980cce020f442329299efb08caCary Clarkstatic jint nativeGetBlockLeftEdge(JNIEnv *env, jobject obj, jint x, jint y, 2425fa768f11d82c34980cce020f442329299efb08caCary Clark jfloat scale) 2426a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba{ 2427a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba WebView* view = GET_NATIVE_VIEW(env, obj); 2428a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 2429a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba if (!view) 2430a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba return -1; 2431fa768f11d82c34980cce020f442329299efb08caCary Clark return view->getBlockLeftEdge(x, y, scale); 2432a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba} 2433a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba 24348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeDestroy(JNIEnv *env, jobject obj) 24358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 24368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 24378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOGD("nativeDestroy view: %p", view); 24388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in nativeDestroy"); 24398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete view; 24408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24428360bc9c9facd690e42379610cbbb368d3d705efCary Clarkstatic void nativeStopGL(JNIEnv *env, jobject obj) 24438360bc9c9facd690e42379610cbbb368d3d705efCary Clark{ 24448360bc9c9facd690e42379610cbbb368d3d705efCary Clark GET_NATIVE_VIEW(env, obj)->stopGL(); 24458360bc9c9facd690e42379610cbbb368d3d705efCary Clark} 24468360bc9c9facd690e42379610cbbb368d3d705efCary Clark 24478480ea3097f295aeccf7c088a06cceea543238b7Leon Scrogginsstatic bool nativeMoveCursorToNextTextInput(JNIEnv *env, jobject obj) 2448e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins{ 2449e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins WebView* view = GET_NATIVE_VIEW(env, obj); 2450e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins CachedRoot* root = view->getFrameCache(WebView::DontAllowNewer); 2451e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins if (!root) 24528480ea3097f295aeccf7c088a06cceea543238b7Leon Scroggins return false; 245365966ae193adfef8d40419ad9c11515b0e56f257Cary Clark const CachedNode* current = root->currentCursor(); 245465966ae193adfef8d40419ad9c11515b0e56f257Cary Clark if (!current || !current->isTextInput()) 245565966ae193adfef8d40419ad9c11515b0e56f257Cary Clark current = root->currentFocus(); 245665966ae193adfef8d40419ad9c11515b0e56f257Cary Clark if (!current || !current->isTextInput()) 24578480ea3097f295aeccf7c088a06cceea543238b7Leon Scroggins return false; 2458e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins const CachedFrame* frame; 245965966ae193adfef8d40419ad9c11515b0e56f257Cary Clark const CachedNode* next = root->nextTextField(current, &frame); 2460e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins if (!next) 24618480ea3097f295aeccf7c088a06cceea543238b7Leon Scroggins return false; 2462f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark const WebCore::IntRect& bounds = next->bounds(frame); 2463b0c9a2b4033eca931163e8223d7eaa8889337144Patrick Scott root->rootHistory()->setMouseBounds(bounds); 246487962ce00229855c098ba12cee8d5c015a835289Cary Clark view->getWebViewCore()->updateCursorBounds(root, frame, next); 246532dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark view->showCursorUntimed(); 2466e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins root->setCursor(const_cast<CachedFrame*>(frame), 2467e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins const_cast<CachedNode*>(next)); 2468bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins view->sendMoveFocus(static_cast<WebCore::Frame*>(frame->framePointer()), 2469bf16ddc110ef3fde2cfa1ae43ab31d993377981dLeon Scroggins static_cast<WebCore::Node*>(next->nodePointer())); 24705065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark if (!next->isInLayer()) 24715065a677456ac1cb630e5271e781b2aa796af7a5Cary Clark view->scrollRectOnScreen(bounds); 2472f74580c1504dcdd43fd15995b0e137982512dba2Leon Scroggins view->getWebViewCore()->m_moveGeneration++; 24738480ea3097f295aeccf7c088a06cceea543238b7Leon Scroggins return true; 2474e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins} 2475e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins 247646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic int nativeMoveGeneration(JNIEnv *env, jobject obj) 247746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 247836747fa778285f57f2f53c047028be83e9d8776dCary Clark WebView* view = GET_NATIVE_VIEW(env, obj); 247936747fa778285f57f2f53c047028be83e9d8776dCary Clark if (!view) 248036747fa778285f57f2f53c047028be83e9d8776dCary Clark return 0; 2481b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark return view->moveGeneration(); 248246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 248346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 2484a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeMoveSelection(JNIEnv *env, jobject obj, int x, int y) 24858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2486a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark GET_NATIVE_VIEW(env, obj)->moveSelection(x, y); 2487a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 2488a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 2489a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeResetSelection(JNIEnv *env, jobject obj) 2490a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 2491a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark return GET_NATIVE_VIEW(env, obj)->resetSelection(); 2492a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 2493a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 2494515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clarkstatic jobject nativeSelectableText(JNIEnv* env, jobject obj) 2495515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark{ 2496515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark IntPoint pos = GET_NATIVE_VIEW(env, obj)->selectableText(); 2497515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark jclass pointClass = env->FindClass("android/graphics/Point"); 2498515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark jmethodID init = env->GetMethodID(pointClass, "<init>", "(II)V"); 2499515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark jobject point = env->NewObject(pointClass, init, pos.x(), pos.y()); 2500515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark env->DeleteLocalRef(pointClass); 2501515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark return point; 2502515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark} 2503515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark 2504a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeSelectAll(JNIEnv* env, jobject obj) 2505a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 2506a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark GET_NATIVE_VIEW(env, obj)->selectAll(); 2507a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 2508a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 2509a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeSetExtendSelection(JNIEnv *env, jobject obj) 2510a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 2511a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark GET_NATIVE_VIEW(env, obj)->setExtendSelection(); 2512a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 2513a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 2514a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic jboolean nativeStartSelection(JNIEnv *env, jobject obj, int x, int y) 2515a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 2516a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark return GET_NATIVE_VIEW(env, obj)->startSelection(x, y); 2517a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 2518a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 2519a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic jboolean nativeWordSelection(JNIEnv *env, jobject obj, int x, int y) 2520a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 2521a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark return GET_NATIVE_VIEW(env, obj)->wordSelection(x, y); 2522a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 2523a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 2524a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic void nativeExtendSelection(JNIEnv *env, jobject obj, int x, int y) 2525a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 2526a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark GET_NATIVE_VIEW(env, obj)->extendSelection(x, y); 25278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jobject nativeGetSelection(JNIEnv *env, jobject obj) 25308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 25328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 25335e5962825729a211e093fd615ddc9e5b0bec10bdCary Clark String selection = view->getSelection(); 253479b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block return wtfStringToJstring(env, selection); 25358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2537a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic jboolean nativeHitSelection(JNIEnv *env, jobject obj, int x, int y) 2538a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 2539a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark return GET_NATIVE_VIEW(env, obj)->hitSelection(x, y); 2540a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 2541a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 2542a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic jint nativeSelectionX(JNIEnv *env, jobject obj) 254387962ce00229855c098ba12cee8d5c015a835289Cary Clark{ 2544a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark return GET_NATIVE_VIEW(env, obj)->selectionX(); 254587962ce00229855c098ba12cee8d5c015a835289Cary Clark} 254687962ce00229855c098ba12cee8d5c015a835289Cary Clark 2547a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clarkstatic jint nativeSelectionY(JNIEnv *env, jobject obj) 2548a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark{ 2549a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark return GET_NATIVE_VIEW(env, obj)->selectionY(); 2550a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark} 2551a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark 2552223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reckstatic void nativeSetSelectionPointer(JNIEnv *env, jobject obj, jint nativeView, 2553223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck jboolean set, jfloat scale, jint x, jint y) 255487962ce00229855c098ba12cee8d5c015a835289Cary Clark{ 2555223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck ((WebView*)nativeView)->setSelectionPointer(set, scale, x, y); 255687962ce00229855c098ba12cee8d5c015a835289Cary Clark} 255787962ce00229855c098ba12cee8d5c015a835289Cary Clark 2558af33356e96e56310c66b47b6db913e1a61981ca3Chris Craikstatic void nativeRegisterPageSwapCallback(JNIEnv *env, jobject obj) 2559af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik{ 2560af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik GET_NATIVE_VIEW(env, obj)->registerPageSwapCallback(); 2561af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik} 2562af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik 25635dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic void nativeTileProfilingStart(JNIEnv *env, jobject obj) 25645dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{ 2565687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik TilesManager::instance()->getProfiler()->start(); 25665dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik} 25675dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik 25685dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic float nativeTileProfilingStop(JNIEnv *env, jobject obj) 25695dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{ 2570687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return TilesManager::instance()->getProfiler()->stop(); 25715dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik} 25725dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik 25735dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic void nativeTileProfilingClear(JNIEnv *env, jobject obj) 25745dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{ 2575687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik TilesManager::instance()->getProfiler()->clear(); 25765dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik} 25775dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik 25785dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic int nativeTileProfilingNumFrames(JNIEnv *env, jobject obj) 25795dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{ 2580687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return TilesManager::instance()->getProfiler()->numFrames(); 25815dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik} 25825dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik 25835dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic int nativeTileProfilingNumTilesInFrame(JNIEnv *env, jobject obj, int frame) 25845dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{ 2585687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return TilesManager::instance()->getProfiler()->numTilesInFrame(frame); 25865dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik} 25875dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik 2588687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craikstatic int nativeTileProfilingGetInt(JNIEnv *env, jobject obj, int frame, int tile, jstring jkey) 25895dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{ 2590687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik WTF::String key = jstringToWtfString(env, jkey); 2591687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik TileProfileRecord* record = TilesManager::instance()->getProfiler()->getTile(frame, tile); 2592687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik 2593687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik if (key == "left") 2594687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return record->left; 2595687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik if (key == "top") 2596687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return record->top; 2597687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik if (key == "right") 2598687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return record->right; 2599687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik if (key == "bottom") 2600687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return record->bottom; 2601687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik if (key == "level") 2602687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return record->level; 2603687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik if (key == "isReady") 2604687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return record->isReady ? 1 : 0; 2605687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return -1; 26065dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik} 26075dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik 2608687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craikstatic float nativeTileProfilingGetFloat(JNIEnv *env, jobject obj, int frame, int tile, jstring jkey) 26095dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{ 2610687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik TileProfileRecord* record = TilesManager::instance()->getProfiler()->getTile(frame, tile); 2611687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return record->scale; 26125dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik} 26135dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik 26148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_DUMP_DISPLAY_TREE 26158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void dumpToFile(const char text[], void* file) { 26168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fwrite(text, 1, strlen(text), reinterpret_cast<FILE*>(file)); 26178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fwrite("\n", 1, 1, reinterpret_cast<FILE*>(file)); 26188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 26198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 26208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2621f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roardstatic bool nativeSetProperty(JNIEnv *env, jobject obj, jstring jkey, jstring jvalue) 2622d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck{ 2623d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck WTF::String key = jstringToWtfString(env, jkey); 2624d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck WTF::String value = jstringToWtfString(env, jvalue); 2625ef238925ea0ba6305e4540aff5c6953503993f3bNicolas Roard if (key == "inverted") { 2626d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck if (value == "true") 2627d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck TilesManager::instance()->setInvertedScreen(true); 2628d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck else 2629d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck TilesManager::instance()->setInvertedScreen(false); 2630f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard return true; 2631d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck } 2632ef238925ea0ba6305e4540aff5c6953503993f3bNicolas Roard if (key == "inverted_contrast") { 2633bbb9caa2571e2c0192861a336c358412e9e7f0c7Nicolas Roard float contrast = value.toFloat(); 2634bbb9caa2571e2c0192861a336c358412e9e7f0c7Nicolas Roard TilesManager::instance()->setInvertedScreenContrast(contrast); 2635f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard return true; 2636bbb9caa2571e2c0192861a336c358412e9e7f0c7Nicolas Roard } 26370960fe0e966317c4728542e9cfaa259523665900Teng-Hui Zhu if (key == "enable_cpu_upload_path") { 26380960fe0e966317c4728542e9cfaa259523665900Teng-Hui Zhu TilesManager::instance()->transferQueue()->setTextureUploadType( 26390960fe0e966317c4728542e9cfaa259523665900Teng-Hui Zhu value == "true" ? CpuUpload : GpuUpload); 26400960fe0e966317c4728542e9cfaa259523665900Teng-Hui Zhu return true; 26410960fe0e966317c4728542e9cfaa259523665900Teng-Hui Zhu } 2642f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard return false; 2643d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck} 2644d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck 2645d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reckstatic jstring nativeGetProperty(JNIEnv *env, jobject obj, jstring key) 2646d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck{ 2647d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck return 0; 2648d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck} 2649d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck 265052f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reckstatic void nativeOnTrimMemory(JNIEnv *env, jobject obj, jint level) 265152f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck{ 26522986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik if (TilesManager::hardwareAccelerationEnabled()) { 26532986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik bool freeAllTextures = (level > TRIM_MEMORY_UI_HIDDEN); 26542986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik TilesManager::instance()->deallocateTextures(freeAllTextures); 26552986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik } 265652f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck} 265752f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck 26588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeDumpDisplayTree(JNIEnv* env, jobject jwebview, jstring jurl) 26598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 26608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_DUMP_DISPLAY_TREE 26618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, jwebview); 26628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 26638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2664bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed if (view && view->getWebViewCore()) { 2665bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed FILE* file = fopen(DISPLAY_TREE_LOG_FILE, "w"); 2666bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed if (file) { 2667bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed SkFormatDumper dumper(dumpToFile, file); 2668bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed // dump the URL 2669bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed if (jurl) { 2670bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed const char* str = env->GetStringUTFChars(jurl, 0); 2671bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed SkDebugf("Dumping %s to %s\n", str, DISPLAY_TREE_LOG_FILE); 2672bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed dumpToFile(str, file); 2673bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed env->ReleaseStringUTFChars(jurl, str); 26748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2675bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed // now dump the display tree 2676bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed SkDumpCanvas canvas(&dumper); 2677bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed // this will playback the picture into the canvas, which will 2678bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed // spew its contents to the dumper 26796d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba view->draw(&canvas, 0, 0, false); 2680bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed // we're done with the file now 2681bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed fwrite("\n", 1, 1, file); 2682bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed fclose(file); 26838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2684859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard#if USE(ACCELERATED_COMPOSITING) 26856d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba const LayerAndroid* rootLayer = view->compositeRoot(); 2686f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark if (rootLayer) { 2687859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard FILE* file = fopen(LAYERS_TREE_LOG_FILE,"w"); 2688859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard if (file) { 2689859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard rootLayer->dumpLayers(file, 0); 2690859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard fclose(file); 2691859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard } 2692859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard } 2693859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard#endif 26948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 26958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 26968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 26978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2698f81c672a4f5c06621000a6df0984cde689397d94Cary Clarkstatic int nativeScrollableLayer(JNIEnv* env, jobject jwebview, jint x, jint y, 2699f81c672a4f5c06621000a6df0984cde689397d94Cary Clark jobject rect, jobject bounds) 2700a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{ 2701a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott WebView* view = GET_NATIVE_VIEW(env, jwebview); 2702a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 2703f81c672a4f5c06621000a6df0984cde689397d94Cary Clark SkIRect nativeRect, nativeBounds; 2704f81c672a4f5c06621000a6df0984cde689397d94Cary Clark int id = view->scrollableLayer(x, y, &nativeRect, &nativeBounds); 2705f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins if (rect) 2706f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins GraphicsJNI::irect_to_jrect(nativeRect, env, rect); 2707f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins if (bounds) 2708f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins GraphicsJNI::irect_to_jrect(nativeBounds, env, bounds); 270922e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott return id; 2710a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott} 2711a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott 271222e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scottstatic bool nativeScrollLayer(JNIEnv* env, jobject obj, jint layerId, jint x, 271322e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott jint y) 2714a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{ 2715a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL) 2716a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott WebView* view = GET_NATIVE_VIEW(env, obj); 27178598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott LayerAndroid* root = view->compositeRoot(); 27188598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott if (!root) 27198598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott return false; 27208598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott LayerAndroid* layer = root->findById(layerId); 2721fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott if (!layer || !layer->contentIsScrollable()) 2722a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott return false; 2723fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott return static_cast<ScrollableLayerAndroid*>(layer)->scrollTo(x, y); 2724a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#endif 2725a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott return false; 2726a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott} 2727a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott 2728f51a51f6ea307f4311a04aa865a42b233269540bChris Craikstatic void nativeSetIsScrolling(JNIEnv* env, jobject jwebview, jboolean isScrolling) 2729f51a51f6ea307f4311a04aa865a42b233269540bChris Craik{ 2730f51a51f6ea307f4311a04aa865a42b233269540bChris Craik WebView* view = GET_NATIVE_VIEW(env, jwebview); 2731f51a51f6ea307f4311a04aa865a42b233269540bChris Craik LOG_ASSERT(view, "view not set in %s", __FUNCTION__); 2732f51a51f6ea307f4311a04aa865a42b233269540bChris Craik view->setIsScrolling(isScrolling); 2733f51a51f6ea307f4311a04aa865a42b233269540bChris Craik} 2734f51a51f6ea307f4311a04aa865a42b233269540bChris Craik 2735c7e578330aece3c556ef205365c24676687223e2Derek Sollenbergerstatic void nativeUseHardwareAccelSkia(JNIEnv*, jobject, jboolean enabled) 2736c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger{ 2737c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger BaseRenderer::setCurrentRendererType(enabled ? BaseRenderer::Ganesh : BaseRenderer::Raster); 2738c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger} 2739c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger 27405e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reckstatic int nativeGetBackgroundColor(JNIEnv* env, jobject obj) 27415e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck{ 27425e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck WebView* view = GET_NATIVE_VIEW(env, obj); 27435e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck BaseLayerAndroid* baseLayer = view->getBaseLayer(); 27445e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck if (baseLayer) { 27455e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck WebCore::Color color = baseLayer->getBackgroundColor(); 27465e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck if (color.isValid()) 27475e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck return SkColorSetARGB(color.alpha(), color.red(), 27485e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck color.green(), color.blue()); 27495e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck } 27505e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck return SK_ColorWHITE; 27515e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck} 27525e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck 27538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 27548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * JNI registration 27558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 27568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic JNINativeMethod gJavaWebViewMethods[] = { 2757d4924af12855cd19162ba1442a6055664c98ca32Cary Clark { "nativeCacheHitFramePointer", "()I", 2758d4924af12855cd19162ba1442a6055664c98ca32Cary Clark (void*) nativeCacheHitFramePointer }, 2759b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark { "nativeCacheHitIsPlugin", "()Z", 2760b57c3a124715a89ac026e86f4fd3890529525d11Cary Clark (void*) nativeCacheHitIsPlugin }, 2761d4924af12855cd19162ba1442a6055664c98ca32Cary Clark { "nativeCacheHitNodeBounds", "()Landroid/graphics/Rect;", 2762d4924af12855cd19162ba1442a6055664c98ca32Cary Clark (void*) nativeCacheHitNodeBounds }, 2763d4924af12855cd19162ba1442a6055664c98ca32Cary Clark { "nativeCacheHitNodePointer", "()I", 2764d4924af12855cd19162ba1442a6055664c98ca32Cary Clark (void*) nativeCacheHitNodePointer }, 2765c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark { "nativeClearCursor", "()V", 2766bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins (void*) nativeClearCursor }, 2767ce03c1c1203621e552d41a8b3831837636f364a9Ben Murdoch { "nativeCreate", "(ILjava/lang/String;)V", 27688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (void*) nativeCreate }, 276946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeCursorFramePointer", "()I", 277046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeCursorFramePointer }, 27711cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins { "nativePageShouldHandleShiftAndArrows", "()Z", 27721cc2f5523913bd14a01c0c85710dcd6f0d7b5bb8Leon Scroggins (void*) nativePageShouldHandleShiftAndArrows }, 277346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeCursorNodeBounds", "()Landroid/graphics/Rect;", 277446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeCursorNodeBounds }, 277546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeCursorNodePointer", "()I", 277646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeCursorNodePointer }, 277746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeCursorIntersects", "(Landroid/graphics/Rect;)Z", 277846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeCursorIntersects }, 277946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeCursorIsAnchor", "()Z", 278046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeCursorIsAnchor }, 278146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeCursorIsTextInput", "()Z", 278246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeCursorIsTextInput }, 278336747fa778285f57f2f53c047028be83e9d8776dCary Clark { "nativeCursorPosition", "()Landroid/graphics/Point;", 278436747fa778285f57f2f53c047028be83e9d8776dCary Clark (void*) nativeCursorPosition }, 278546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeCursorText", "()Ljava/lang/String;", 278646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeCursorText }, 2787f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark { "nativeCursorWantsKeyEvents", "()Z", 2788f4669cac3858848a9247e801b6106aeae6d406e8Cary Clark (void*)nativeCursorWantsKeyEvents }, 27898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { "nativeDebugDump", "()V", 27908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (void*) nativeDebugDump }, 27918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { "nativeDestroy", "()V", 27928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (void*) nativeDestroy }, 27936d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba { "nativeDraw", "(Landroid/graphics/Canvas;IIZ)I", 27946d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba (void*) nativeDraw }, 2795223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck { "nativeGetDrawGLFunction", "(ILandroid/graphics/Rect;Landroid/graphics/Rect;FI)I", 2796908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase (void*) nativeGetDrawGLFunction }, 2797b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy { "nativeUpdateDrawGLFunction", "(Landroid/graphics/Rect;Landroid/graphics/Rect;)V", 2798908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase (void*) nativeUpdateDrawGLFunction }, 279946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeDumpDisplayTree", "(Ljava/lang/String;)V", 280046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeDumpDisplayTree }, 2801223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck { "nativeEvaluateLayersAnimations", "(I)Z", 280287962ce00229855c098ba12cee8d5c015a835289Cary Clark (void*) nativeEvaluateLayersAnimations }, 2803a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark { "nativeExtendSelection", "(II)V", 2804a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark (void*) nativeExtendSelection }, 2805db17cf1782eab2488aab0933add6c79b21639c08Leon Scroggins { "nativeFindAll", "(Ljava/lang/String;Ljava/lang/String;Z)I", 280646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeFindAll }, 280746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeFindNext", "(Z)V", 280846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeFindNext }, 2809afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins { "nativeFindIndex", "()I", 2810afbc0998ef990403a8e17efb9a384a46707a328eLeon Scroggins (void*) nativeFindIndex}, 281149e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark { "nativeFocusCandidateFramePointer", "()I", 281249e856e5d5e86855d12326294cb6b57235a2e9a1Cary Clark (void*) nativeFocusCandidateFramePointer }, 28132194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins { "nativeFocusCandidateHasNextTextfield", "()Z", 28142194b17e89b2ad4c0624f7612e417db6d69150adLeon Scroggins (void*) focusCandidateHasNextTextfield }, 2815bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins { "nativeFocusCandidateIsPassword", "()Z", 2816bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins (void*) nativeFocusCandidateIsPassword }, 2817bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins { "nativeFocusCandidateIsRtlText", "()Z", 2818bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins (void*) nativeFocusCandidateIsRtlText }, 2819bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins { "nativeFocusCandidateIsTextInput", "()Z", 2820bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins (void*) nativeFocusCandidateIsTextInput }, 2821d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins { "nativeFocusCandidateLineHeight", "()I", 2822d8fcffded6ee266e903e4e191ed95a07007fac74Leon Scroggins (void*) nativeFocusCandidateLineHeight }, 2823bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins { "nativeFocusCandidateMaxLength", "()I", 2824bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins (void*) nativeFocusCandidateMaxLength }, 2825ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins { "nativeFocusCandidateIsAutoComplete", "()Z", 2826ba87d726a9663788c0c5eae2ddb6c3ee24c4a740Leon Scroggins (void*) nativeFocusCandidateIsAutoComplete }, 282785e3844824444f304a15e57f62d2e5670fb3bf47Michael Kolb { "nativeFocusCandidateIsSpellcheck", "()Z", 282885e3844824444f304a15e57f62d2e5670fb3bf47Michael Kolb (void*) nativeFocusCandidateIsSpellcheck }, 2829bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins { "nativeFocusCandidateName", "()Ljava/lang/String;", 2830bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins (void*) nativeFocusCandidateName }, 2831bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins { "nativeFocusCandidateNodeBounds", "()Landroid/graphics/Rect;", 2832bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins (void*) nativeFocusCandidateNodeBounds }, 2833390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins { "nativeFocusCandidatePaddingRect", "()Landroid/graphics/Rect;", 2834390c2b5702d131f0875199fdca1c3ba5010d7659Leon Scroggins (void*) nativeFocusCandidatePaddingRect }, 2835bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins { "nativeFocusCandidatePointer", "()I", 2836bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins (void*) nativeFocusCandidatePointer }, 2837bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins { "nativeFocusCandidateText", "()Ljava/lang/String;", 2838bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins (void*) nativeFocusCandidateText }, 28393a3b28707d2d6a06afe9f3137e9bedc07246d600Leon Scroggins { "nativeFocusCandidateTextSize", "()F", 2840bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins (void*) nativeFocusCandidateTextSize }, 284174757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins { "nativeFocusCandidateType", "()I", 284274757b62fce144f27c25cc7744df82cd7411b2dcLeon Scroggins (void*) nativeFocusCandidateType }, 2843c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger { "nativeFocusIsPlugin", "()Z", 2844c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger (void*) nativeFocusIsPlugin }, 28458026280044128436d8e89736519a0b32b6540201Cary Clark { "nativeFocusNodeBounds", "()Landroid/graphics/Rect;", 28468026280044128436d8e89736519a0b32b6540201Cary Clark (void*) nativeFocusNodeBounds }, 2847539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins { "nativeFocusNodePointer", "()I", 2848539427bc7572dfd8b28579c67460186406dcb246Leon Scroggins (void*) nativeFocusNodePointer }, 284946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeGetCursorRingBounds", "()Landroid/graphics/Rect;", 285046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeGetCursorRingBounds }, 28515e5962825729a211e093fd615ddc9e5b0bec10bdCary Clark { "nativeGetSelection", "()Ljava/lang/String;", 285246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeGetSelection }, 285346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeHasCursorNode", "()Z", 285446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeHasCursorNode }, 285546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeHasFocusNode", "()Z", 285646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeHasFocusNode }, 2857c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark { "nativeHideCursor", "()V", 2858c3fe941b7eb7da66bcea91b3513053d2ea60586fCary Clark (void*) nativeHideCursor }, 2859a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark { "nativeHitSelection", "(II)Z", 2860a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark (void*) nativeHitSelection }, 286146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeImageURI", "(II)Ljava/lang/String;", 286246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeImageURI }, 28638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { "nativeInstrumentReport", "()V", 28648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (void*) nativeInstrumentReport }, 28659092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark { "nativeLayerBounds", "(I)Landroid/graphics/Rect;", 28669092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark (void*) nativeLayerBounds }, 2867d48434fc633d173b549b97b1c614072adc9648a8Cary Clark { "nativeMotionUp", "(III)Z", 28688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (void*) nativeMotionUp }, 2869bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins { "nativeMoveCursor", "(IIZ)Z", 2870bc0656f7505db89baea5835febb882daf32f32a6Leon Scroggins (void*) nativeMoveCursor }, 28718480ea3097f295aeccf7c088a06cceea543238b7Leon Scroggins { "nativeMoveCursorToNextTextInput", "()Z", 2872e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins (void*) nativeMoveCursorToNextTextInput }, 287346dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeMoveGeneration", "()I", 287446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeMoveGeneration }, 2875a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark { "nativeMoveSelection", "(II)V", 287646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeMoveSelection }, 2877d4924af12855cd19162ba1442a6055664c98ca32Cary Clark { "nativePointInNavCache", "(III)Z", 2878d4924af12855cd19162ba1442a6055664c98ca32Cary Clark (void*) nativePointInNavCache }, 2879223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck { "nativeRecordButtons", "(IZZZ)V", 28808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (void*) nativeRecordButtons }, 2881a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark { "nativeResetSelection", "()V", 2882a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark (void*) nativeResetSelection }, 2883515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark { "nativeSelectableText", "()Landroid/graphics/Point;", 2884515943cc7c9a60faa661739271d5fa14fcba9df8Cary Clark (void*) nativeSelectableText }, 2885a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark { "nativeSelectAll", "()V", 2886a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark (void*) nativeSelectAll }, 28878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { "nativeSelectBestAt", "(Landroid/graphics/Rect;)V", 28888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (void*) nativeSelectBestAt }, 28891b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov { "nativeSelectAt", "(II)V", 28901b7a61602d4e5a47094a3eaf8d1d9d12fb78402dSvetoslav Ganov (void*) nativeSelectAt }, 2891a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark { "nativeSelectionX", "()I", 2892a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark (void*) nativeSelectionX }, 2893a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark { "nativeSelectionY", "()I", 2894a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark (void*) nativeSelectionY }, 2895a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark { "nativeSetExtendSelection", "()V", 2896a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark (void*) nativeSetExtendSelection }, 2897afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark { "nativeSetFindIsEmpty", "()V", 2898afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark (void*) nativeSetFindIsEmpty }, 2899afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark { "nativeSetFindIsUp", "(Z)V", 2900d74d4ceff106be90d9eaf08ec191a96bd87a7007Cary Clark (void*) nativeSetFindIsUp }, 29018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { "nativeSetHeightCanMeasure", "(Z)V", 29028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (void*) nativeSetHeightCanMeasure }, 290396eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik { "nativeSetBaseLayer", "(ILandroid/graphics/Region;ZZZ)V", 29046d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba (void*) nativeSetBaseLayer }, 29058111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck { "nativeGetTextSelectionRegion", "(Landroid/graphics/Region;)V", 29068111ace8860f79c6b7ece2c408a3f80a0762b09bJohn Reck (void*) nativeGetTextSelectionRegion }, 29074212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck { "nativeGetBaseLayer", "()I", 29084212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck (void*) nativeGetBaseLayer }, 29096d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba { "nativeReplaceBaseContent", "(I)V", 29106d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba (void*) nativeReplaceBaseContent }, 29116d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba { "nativeCopyBaseContentToPicture", "(Landroid/graphics/Picture;)V", 29126d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba (void*) nativeCopyBaseContentToPicture }, 29136d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba { "nativeHasContent", "()Z", 29146d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba (void*) nativeHasContent }, 2915223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck { "nativeSetSelectionPointer", "(IZFII)V", 291687962ce00229855c098ba12cee8d5c015a835289Cary Clark (void*) nativeSetSelectionPointer }, 291732dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark { "nativeShowCursorTimed", "()V", 291832dffb883f56b18019afa7a01b2564b993b3fe8eCary Clark (void*) nativeShowCursorTimed }, 2919af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik { "nativeRegisterPageSwapCallback", "()V", 2920af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik (void*) nativeRegisterPageSwapCallback }, 29215dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik { "nativeTileProfilingStart", "()V", 29225dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik (void*) nativeTileProfilingStart }, 29235dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik { "nativeTileProfilingStop", "()F", 29245dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik (void*) nativeTileProfilingStop }, 29255dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik { "nativeTileProfilingClear", "()V", 29265dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik (void*) nativeTileProfilingClear }, 29275dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik { "nativeTileProfilingNumFrames", "()I", 29285dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik (void*) nativeTileProfilingNumFrames }, 29295dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik { "nativeTileProfilingNumTilesInFrame", "(I)I", 29305dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik (void*) nativeTileProfilingNumTilesInFrame }, 2931687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik { "nativeTileProfilingGetInt", "(IILjava/lang/String;)I", 2932687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik (void*) nativeTileProfilingGetInt }, 2933687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik { "nativeTileProfilingGetFloat", "(IILjava/lang/String;)F", 2934687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik (void*) nativeTileProfilingGetFloat }, 2935a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark { "nativeStartSelection", "(II)Z", 2936a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark (void*) nativeStartSelection }, 29378360bc9c9facd690e42379610cbbb368d3d705efCary Clark { "nativeStopGL", "()V", 29388360bc9c9facd690e42379610cbbb368d3d705efCary Clark (void*) nativeStopGL }, 2939cc4e3c422964c7d999e8f340057f303140d845ddCary Clark { "nativeSubtractLayers", "(Landroid/graphics/Rect;)Landroid/graphics/Rect;", 2940cc4e3c422964c7d999e8f340057f303140d845ddCary Clark (void*) nativeSubtractLayers }, 294146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeTextGeneration", "()I", 294246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeTextGeneration }, 29438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { "nativeUpdateCachedTextfield", "(Ljava/lang/String;I)V", 2944b6631b666120e63a9ceee4a77613cf962fa37b1fCary Clark (void*) nativeUpdateCachedTextfield }, 2945a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark { "nativeWordSelection", "(II)Z", 2946a3054d2b31d3e00563e3865d398ef93d25b8b2e0Cary Clark (void*) nativeWordSelection }, 2947fa768f11d82c34980cce020f442329299efb08caCary Clark { "nativeGetBlockLeftEdge", "(IIF)I", 2948a50885e6d06f2cfdee3bf43b1fb367bca126c5dcGrace Kloba (void*) nativeGetBlockLeftEdge }, 2949f81c672a4f5c06621000a6df0984cde689397d94Cary Clark { "nativeScrollableLayer", "(IILandroid/graphics/Rect;Landroid/graphics/Rect;)I", 2950a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott (void*) nativeScrollableLayer }, 2951a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott { "nativeScrollLayer", "(III)Z", 2952a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott (void*) nativeScrollLayer }, 2953f51a51f6ea307f4311a04aa865a42b233269540bChris Craik { "nativeSetIsScrolling", "(Z)V", 2954f51a51f6ea307f4311a04aa865a42b233269540bChris Craik (void*) nativeSetIsScrolling }, 2955c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger { "nativeUseHardwareAccelSkia", "(Z)V", 2956c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger (void*) nativeUseHardwareAccelSkia }, 29575e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck { "nativeGetBackgroundColor", "()I", 29585e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck (void*) nativeGetBackgroundColor }, 2959f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard { "nativeSetProperty", "(Ljava/lang/String;Ljava/lang/String;)Z", 2960d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck (void*) nativeSetProperty }, 2961d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck { "nativeGetProperty", "(Ljava/lang/String;)Ljava/lang/String;", 2962d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck (void*) nativeGetProperty }, 296352f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck { "nativeOnTrimMemory", "(I)V", 296452f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck (void*) nativeOnTrimMemory }, 29658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 29668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2967b92850e0391d674b9c4826b66105aaa3dd3eef96Steve Blockint registerWebView(JNIEnv* env) 29688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 29698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jclass clazz = env->FindClass("android/webkit/WebView"); 29708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(clazz, "Unable to find class android/webkit/WebView"); 29718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project gWebViewField = env->GetFieldID(clazz, "mNativeClass", "I"); 29728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ASSERT(gWebViewField, "Unable to find android/webkit/WebView.mNativeClass"); 2973bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block env->DeleteLocalRef(clazz); 29748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 29758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return jniRegisterNativeMethods(env, "android/webkit/WebView", gJavaWebViewMethods, NELEM(gJavaWebViewMethods)); 29768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 29778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 29788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace android 2979