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