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