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"
33594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik#include "BaseRenderer.h"
3487962ce00229855c098ba12cee8d5c015a835289Cary Clark#include "DrawExtra.h"
35cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reck#include "DumpLayer.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h"
37594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik#include "GLWebViewState.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsJNI.h"
39dcbb033aafed2abc472f0d88520869a6b1f1945bLeon Scroggins#include "HTMLInputElement.h"
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IntPoint.h"
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IntRect.h"
42797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#include "LayerAndroid.h"
43885e650b12d781be054b31ae6221925a0184dc33Chris Craik#include "LayerContent.h"
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Node.h"
45908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase#include "utils/Functor.h"
46d1f5cf1ad8b20860bd9cb34a483451019124d1f9Romain Guy#include "private/hwui/DrawGlInfo.h"
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformGraphicsContext.h"
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h"
49fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott#include "ScrollableLayerAndroid.h"
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SelectText.h"
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkCanvas.h"
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkDumpCanvas.h"
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkPicture.h"
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkRect.h"
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkTime.h"
56a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "TilesManager.h"
57594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik#include "TransferQueue.h"
5820ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "WebCoreJni.h"
590b84ecf50c01e0fbf7307ca7cae55ab3043c75a3Elliott Slaughter#include "WebRequestContext.h"
6020ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "WebViewCore.h"
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef GET_NATIVE_VIEW
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#undef GET_NATIVE_VIEW
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define GET_NATIVE_VIEW(env, obj) ((WebView*)env->GetIntField(obj, gWebViewField))
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6820ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include <JNIUtility.h>
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <JNIHelp.h>
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <jni.h>
7177e73dcd79e53291251ce5e67ba55ce911bb07f6Mathias Agopian#include <androidfw/KeycodeLabels.h>
72dd7ee22af4f03672fa823324323466054f19a054Iain Merrick#include <wtf/text/AtomicString.h>
7379768700a853c40c66ff0b0591957958667fdd9eSteve Block#include <wtf/text/CString.h>
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7552f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck// Free as much as we possible can
7652f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck#define TRIM_MEMORY_COMPLETE 80
7752f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck// Free a lot (all textures gone)
7852f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck#define TRIM_MEMORY_MODERATE 60
7952f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck// More moderate free (keep bare minimum to restore quickly-ish - possibly clear all textures)
8052f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck#define TRIM_MEMORY_BACKGROUND 40
8152f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck// Moderate free (clear cached tiles, keep visible ones)
8252f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck#define TRIM_MEMORY_UI_HIDDEN 20
83b31c03a968a578cc43e606ede80cefcd07e8ee07John Reck// Duration to show the pressed cursor ring
84b31c03a968a578cc43e606ede80cefcd07e8ee07John Reck#define PRESSED_STATE_DURATION 400
8552f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace android {
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jfieldID gWebViewField;
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//-------------------------------------
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jmethodID GetJMethod(JNIEnv* env, jclass clazz, const char name[], const char signature[])
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID m = env->GetMethodID(clazz, name, signature);
956dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(m, "Could not find method %s", name);
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m;
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//-------------------------------------
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This class provides JNI for making calls into native code from the UI side
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// of the multi-threaded WebView.
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass WebView
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectenum FrameCachePermission {
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DontAllowNewer,
107f92d7cf56380e421b81212d32a557bda707a9555Steve Block    AllowNewer
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11066c40fc863939bd103a5256eb48e944508725c53Victoria Lease#define DRAW_EXTRAS_SIZE 2
11187962ce00229855c098ba12cee8d5c015a835289Cary Clarkenum DrawExtras { // keep this in sync with WebView.java
11287962ce00229855c098ba12cee8d5c015a835289Cary Clark    DrawExtrasNone = 0,
11366c40fc863939bd103a5256eb48e944508725c53Victoria Lease    DrawExtrasSelection = 1,
11466c40fc863939bd103a5256eb48e944508725c53Victoria Lease    DrawExtrasCursorRing = 2
11587962ce00229855c098ba12cee8d5c015a835289Cary Clark};
11687962ce00229855c098ba12cee8d5c015a835289Cary Clark
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct JavaGlue {
1183bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott    jweak       m_obj;
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_scrollBy;
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_getScaledMaxXScroll;
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_getScaledMaxYScroll;
122be2aeb9261649a2c724b324611e75f5d69cf3baeTeng-Hui Zhu    jmethodID   m_updateRectsForGL;
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_viewInvalidate;
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_viewInvalidateRect;
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_postInvalidateDelayed;
12696eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik    jmethodID   m_pageSwapCallback;
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jfieldID    m_rectLeft;
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jfieldID    m_rectTop;
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_rectWidth;
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_rectHeight;
131304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    jfieldID    m_quadFP1;
132304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    jfieldID    m_quadFP2;
133304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    jfieldID    m_quadFP3;
134304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    jfieldID    m_quadFP4;
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AutoJObject object(JNIEnv* env) {
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return getRealObject(env, m_obj);
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} m_javaGlue;
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14055b4bdbd661ac94fd05ab40de08250bf242d5346John ReckWebView(JNIEnv* env, jobject javaWebView, int viewImpl, WTF::String drawableDir,
14139b886463564843ebfd0557dd12b07bf38cb6d83John Reck        bool isHighEndGfx)
14239b886463564843ebfd0557dd12b07bf38cb6d83John Reck    : m_isHighEndGfx(isHighEndGfx)
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
144dea0c131566f424923425970fe5621305d136e5aJohn Reck    memset(m_extras, 0, DRAW_EXTRAS_SIZE * sizeof(DrawExtra*));
14557ae1393d3097edada2640b40c895396b69cc919Jonathan Dixon    jclass clazz = env->FindClass("android/webkit/WebViewClassic");
1463bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott    m_javaGlue.m_obj = env->NewWeakGlobalRef(javaWebView);
14751c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins    m_javaGlue.m_scrollBy = GetJMethod(env, clazz, "setContentScrollBy", "(IIZ)Z");
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_getScaledMaxXScroll = GetJMethod(env, clazz, "getScaledMaxXScroll", "()I");
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_getScaledMaxYScroll = GetJMethod(env, clazz, "getScaledMaxYScroll", "()I");
150be2aeb9261649a2c724b324611e75f5d69cf3baeTeng-Hui Zhu    m_javaGlue.m_updateRectsForGL = GetJMethod(env, clazz, "updateRectsForGL", "()V");
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_viewInvalidate = GetJMethod(env, clazz, "viewInvalidate", "()V");
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_viewInvalidateRect = GetJMethod(env, clazz, "viewInvalidate", "(IIII)V");
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_postInvalidateDelayed = GetJMethod(env, clazz,
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        "viewInvalidateDelayed", "(JIIII)V");
155aeca53d3fee2e94ce013c1dc12648f0335284fbbChris Craik    m_javaGlue.m_pageSwapCallback = GetJMethod(env, clazz, "pageSwapCallback", "(Z)V");
156bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(clazz);
157bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jclass rectClass = env->FindClass("android/graphics/Rect");
1596dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(rectClass, "Could not find Rect class");
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_rectLeft = env->GetFieldID(rectClass, "left", "I");
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_rectTop = env->GetFieldID(rectClass, "top", "I");
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_rectWidth = GetJMethod(env, rectClass, "width", "()I");
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_rectHeight = GetJMethod(env, rectClass, "height", "()I");
164bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(rectClass);
165bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block
166304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    jclass quadFClass = env->FindClass("android/webkit/QuadF");
167304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    ALOG_ASSERT(quadFClass, "Could not find QuadF class");
168304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    m_javaGlue.m_quadFP1 = env->GetFieldID(quadFClass, "p1", "Landroid/graphics/PointF;");
169304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    m_javaGlue.m_quadFP2 = env->GetFieldID(quadFClass, "p2", "Landroid/graphics/PointF;");
170304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    m_javaGlue.m_quadFP3 = env->GetFieldID(quadFClass, "p3", "Landroid/graphics/PointF;");
171304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    m_javaGlue.m_quadFP4 = env->GetFieldID(quadFClass, "p4", "Landroid/graphics/PointF;");
172304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    env->DeleteLocalRef(quadFClass);
173304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    env->SetIntField(javaWebView, gWebViewField, (jint)this);
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewImpl = (WebViewCore*) viewImpl;
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_generation = 0;
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_heightCanMeasure = false;
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_lastDx = 0;
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_lastDxTime = 0;
1806d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    m_baseLayer = 0;
181908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    m_glDrawFunctor = 0;
182d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck    m_isDrawingPaused = false;
183c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger#if USE(ACCELERATED_COMPOSITING)
184c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    m_glWebViewState = 0;
185c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger#endif
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project~WebView()
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_javaGlue.m_obj)
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        JNIEnv* env = JSC::Bindings::getJNIEnv();
1933bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott        env->DeleteWeakGlobalRef(m_javaGlue.m_obj);
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_javaGlue.m_obj = 0;
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19675394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
197c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    // We must remove the m_glWebViewState prior to deleting m_baseLayer. If we
198c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    // do not remove it here, we risk having BaseTiles trying to paint using a
199c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    // deallocated base layer.
2008360bc9c9facd690e42379610cbbb368d3d705efCary Clark    stopGL();
20175394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roard#endif
202b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger    SkSafeUnref(m_baseLayer);
203908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    delete m_glDrawFunctor;
204dea0c131566f424923425970fe5621305d136e5aJohn Reck    for (int i = 0; i < DRAW_EXTRAS_SIZE; i++)
205dea0c131566f424923425970fe5621305d136e5aJohn Reck        delete m_extras[i];
206dea0c131566f424923425970fe5621305d136e5aJohn Reck}
207dea0c131566f424923425970fe5621305d136e5aJohn Reck
208dea0c131566f424923425970fe5621305d136e5aJohn ReckDrawExtra* getDrawExtra(DrawExtras extras)
209dea0c131566f424923425970fe5621305d136e5aJohn Reck{
210dea0c131566f424923425970fe5621305d136e5aJohn Reck    if (extras == DrawExtrasNone)
211dea0c131566f424923425970fe5621305d136e5aJohn Reck        return 0;
212dea0c131566f424923425970fe5621305d136e5aJohn Reck    return m_extras[extras - 1];
213dea0c131566f424923425970fe5621305d136e5aJohn Reck}
214dea0c131566f424923425970fe5621305d136e5aJohn Reck
2158360bc9c9facd690e42379610cbbb368d3d705efCary Clarkvoid stopGL()
2168360bc9c9facd690e42379610cbbb368d3d705efCary Clark{
2178360bc9c9facd690e42379610cbbb368d3d705efCary Clark#if USE(ACCELERATED_COMPOSITING)
2188360bc9c9facd690e42379610cbbb368d3d705efCary Clark    delete m_glWebViewState;
2198360bc9c9facd690e42379610cbbb368d3d705efCary Clark    m_glWebViewState = 0;
2208360bc9c9facd690e42379610cbbb368d3d705efCary Clark#endif
2218360bc9c9facd690e42379610cbbb368d3d705efCary Clark}
2228360bc9c9facd690e42379610cbbb368d3d705efCary Clark
223bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike ReedWebViewCore* getWebViewCore() const {
224bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed    return m_viewImpl;
225bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed}
226bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed
227afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clarkvoid scrollRectOnScreen(const IntRect& rect)
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
229afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    if (rect.isEmpty())
230afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark        return;
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int dx = 0;
232afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    int left = rect.x();
2331ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block    int right = rect.maxX();
2349e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu    if (left < m_visibleContentRect.fLeft)
2359e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu        dx = left - m_visibleContentRect.fLeft;
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Only scroll right if the entire width can fit on screen.
2379e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu    else if (right > m_visibleContentRect.fRight
2389e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu            && right - left < m_visibleContentRect.width())
2399e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu        dx = right - m_visibleContentRect.fRight;
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int dy = 0;
241afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    int top = rect.y();
2421ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block    int bottom = rect.maxY();
2439e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu    if (top < m_visibleContentRect.fTop)
2449e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu        dy = top - m_visibleContentRect.fTop;
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Only scroll down if the entire height can fit on screen
2469e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu    else if (bottom > m_visibleContentRect.fBottom
2479e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu            && bottom - top < m_visibleContentRect.height())
2489e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu        dy = bottom - m_visibleContentRect.fBottom;
24951c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins    if ((dx|dy) == 0 || !scrollBy(dx, dy))
250afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark        return;
25151c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins    viewInvalidate();
252e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins}
253e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins
2549e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhuint drawGL(WebCore::IntRect& invScreenRect, WebCore::IntRect* invalRect,
2559e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu        WebCore::IntRect& screenRect, int titleBarHeight,
2569e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu        WebCore::IntRect& screenClip, float scale, int extras, bool shouldDraw)
257a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
258a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
259beeb8cbb217cca6094affa12a630bd75938909c9George Mount    if (!m_baseLayer)
260bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu        return 0;
261a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
26235caaaf726b8b17cec92747a1fe42dba44d6b775John Reck    if (m_viewImpl)
26335caaaf726b8b17cec92747a1fe42dba44d6b775John Reck        m_viewImpl->setPrerenderingEnabled(!m_isDrawingPaused);
26435caaaf726b8b17cec92747a1fe42dba44d6b775John Reck
265e47399f767707497dfc68fc64b14621a8ca9959fTeng-Hui Zhu    if (!m_glWebViewState) {
266e1dfe84b38ed080c7bb7ac00fd9e3c6c590a147dTeng-Hui Zhu        TilesManager::instance()->setHighEndGfx(m_isHighEndGfx);
26782ccbd8ce95211b4b5afad6a653462fd3beb771bJohn Reck        m_glWebViewState = new GLWebViewState();
268885e650b12d781be054b31ae6221925a0184dc33Chris Craik        m_glWebViewState->setBaseLayer(m_baseLayer, false, true);
269e47399f767707497dfc68fc64b14621a8ca9959fTeng-Hui Zhu    }
270c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger
27139b886463564843ebfd0557dd12b07bf38cb6d83John Reck    DrawExtra* extra = getDrawExtra((DrawExtras) extras);
272a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
273fcb01cd64de0a1d6f8f8c897d16cc2628be53960John Reck    m_glWebViewState->glExtras()->setDrawExtra(extra);
2740ca8045217bb9b308ddb407d7a9ce17d92d9f9fbNicolas Roard
275d68563709fdf68c90c730155149f6149b084730aJohn Reck    // Make sure we have valid coordinates. We might not have valid coords
276d68563709fdf68c90c730155149f6149b084730aJohn Reck    // if the zoom manager is still initializing. We will be redrawn
277d68563709fdf68c90c730155149f6149b084730aJohn Reck    // once the correct scale is set
2789e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu    if (!m_visibleContentRect.isFinite())
279bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu        return 0;
280aeca53d3fee2e94ce013c1dc12648f0335284fbbChris Craik    bool treesSwapped = false;
281aeca53d3fee2e94ce013c1dc12648f0335284fbbChris Craik    bool newTreeHasAnim = false;
2829e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu    int ret = m_glWebViewState->drawGL(invScreenRect, m_visibleContentRect, invalRect,
2839e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu                                        screenRect, titleBarHeight, screenClip, scale,
284bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu                                        &treesSwapped, &newTreeHasAnim, shouldDraw);
285246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik    if (treesSwapped) {
2866dd76b804786ec760bb04b137a6bf017064226dcSteve Block        ALOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
28796eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik        JNIEnv* env = JSC::Bindings::getJNIEnv();
28896eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik        AutoJObject javaObject = m_javaGlue.object(env);
28996eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik        if (javaObject.get()) {
290aeca53d3fee2e94ce013c1dc12648f0335284fbbChris Craik            env->CallVoidMethod(javaObject.get(), m_javaGlue.m_pageSwapCallback, newTreeHasAnim);
29196eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik            checkException(env);
29296eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik        }
29396eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik    }
294bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu    return m_isDrawingPaused ? 0 : ret;
295a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
296bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu    return 0;
297a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
298a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
299e859a34171f2a36877d95197d118d962078f8aa0John Reckvoid draw(SkCanvas* canvas, SkColor bgColor, DrawExtras extras)
30087962ce00229855c098ba12cee8d5c015a835289Cary Clark{
3016d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (!m_baseLayer) {
3026d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        canvas->drawColor(bgColor);
303e859a34171f2a36877d95197d118d962078f8aa0John Reck        return;
3046d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    }
3056d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
3066d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    // draw the content of the base layer first
307b3f4d3af0b06dc168453641e249d0cb9eec9b570Nicolas Roard    LayerContent* content = m_baseLayer->content();
3086d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    int sc = canvas->save(SkCanvas::kClip_SaveFlag);
309829229abf10ddf6135c682d42a291925ef0da35fTeng-Hui Zhu    if (content) {
31078d0003d44a4fa393275929d92c8e4929e70c7faNicolas Roard        canvas->clipRect(SkRect::MakeLTRB(0, 0, content->width(), content->height()),
31178d0003d44a4fa393275929d92c8e4929e70c7faNicolas Roard                         SkRegion::kDifference_Op);
312829229abf10ddf6135c682d42a291925ef0da35fTeng-Hui Zhu    }
31375fc360d144b97f5e50bedf7ed3222898cc56446Chris Craik    Color c = m_baseLayer->getBackgroundColor();
31475fc360d144b97f5e50bedf7ed3222898cc56446Chris Craik    canvas->drawColor(SkColorSetARGBInline(c.alpha(), c.red(), c.green(), c.blue()));
3156d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    canvas->restoreToCount(sc);
3166d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
317885e650b12d781be054b31ae6221925a0184dc33Chris Craik    // call this to be sure we've adjusted for any scrolling or animations
318885e650b12d781be054b31ae6221925a0184dc33Chris Craik    // before we actually draw
319f8a89eaa1361ce1e71ec7fa9065103fd0b305b5fJohn Reck    m_baseLayer->updatePositionsRecursive(m_visibleContentRect);
320885e650b12d781be054b31ae6221925a0184dc33Chris Craik    m_baseLayer->updatePositions();
321885e650b12d781be054b31ae6221925a0184dc33Chris Craik
322885e650b12d781be054b31ae6221925a0184dc33Chris Craik    // We have to set the canvas' matrix on the base layer
323885e650b12d781be054b31ae6221925a0184dc33Chris Craik    // (to have fixed layers work as intended)
324885e650b12d781be054b31ae6221925a0184dc33Chris Craik    SkAutoCanvasRestore restore(canvas, true);
325885e650b12d781be054b31ae6221925a0184dc33Chris Craik    m_baseLayer->setMatrix(canvas->getTotalMatrix());
326885e650b12d781be054b31ae6221925a0184dc33Chris Craik    canvas->resetMatrix();
327885e650b12d781be054b31ae6221925a0184dc33Chris Craik    m_baseLayer->draw(canvas, getDrawExtra(extras));
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint getScaledMaxXScroll()
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3326dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
334b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
335b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
336b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return 0;
337b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    int result = env->CallIntMethod(javaObject.get(), m_javaGlue.m_getScaledMaxXScroll);
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint getScaledMaxYScroll()
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3446dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
346b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
347b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
348b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return 0;
349b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    int result = env->CallIntMethod(javaObject.get(), m_javaGlue.m_getScaledMaxYScroll);
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
354be2aeb9261649a2c724b324611e75f5d69cf3baeTeng-Hui Zhu// Call through JNI to ask Java side to update the rectangles for GL functor.
355be2aeb9261649a2c724b324611e75f5d69cf3baeTeng-Hui Zhu// This is called at every draw when it is not in process mode, so we should
356be2aeb9261649a2c724b324611e75f5d69cf3baeTeng-Hui Zhu// keep this route as efficient as possible. Currently, its average cost on Xoom
357be2aeb9261649a2c724b324611e75f5d69cf3baeTeng-Hui Zhu// is about 0.1ms - 0.2ms.
358be2aeb9261649a2c724b324611e75f5d69cf3baeTeng-Hui Zhu// Alternatively, this can be achieved by adding more listener on Java side, but
359be2aeb9261649a2c724b324611e75f5d69cf3baeTeng-Hui Zhu// that will be more likely causing jank when triggering GC.
360be2aeb9261649a2c724b324611e75f5d69cf3baeTeng-Hui Zhuvoid updateRectsForGL()
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
363b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
364b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
365be2aeb9261649a2c724b324611e75f5d69cf3baeTeng-Hui Zhu        return;
366be2aeb9261649a2c724b324611e75f5d69cf3baeTeng-Hui Zhu    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_updateRectsForGL);
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37082f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if USE(ACCELERATED_COMPOSITING)
371f81c672a4f5c06621000a6df0984cde689397d94Cary Clarkstatic const ScrollableLayerAndroid* findScrollableLayer(
372f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    const LayerAndroid* parent, int x, int y, SkIRect* foundBounds) {
3734f91e5abbd847c4dee4740d3116f23b73bf02ee5Chris Craik    IntRect bounds = enclosingIntRect(parent->fullContentAreaMapped());
3744f91e5abbd847c4dee4740d3116f23b73bf02ee5Chris Craik
37582f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    // Check the parent bounds first; this will clip to within a masking layer's
37682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    // bounds.
377fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott    if (parent->masksToBounds() && !bounds.contains(x, y))
37882f247bdbb98dd80c44209d87692c650c3704617Patrick Scott        return 0;
3794f91e5abbd847c4dee4740d3116f23b73bf02ee5Chris Craik
38082f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    int count = parent->countChildren();
3811a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott    while (count--) {
3821a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott        const LayerAndroid* child = parent->getChild(count);
3834f91e5abbd847c4dee4740d3116f23b73bf02ee5Chris Craik        const ScrollableLayerAndroid* result = findScrollableLayer(child, x, y, foundBounds);
384f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        if (result) {
385f81c672a4f5c06621000a6df0984cde689397d94Cary Clark            if (parent->masksToBounds()) {
386f81c672a4f5c06621000a6df0984cde689397d94Cary Clark                if (bounds.width() < foundBounds->width())
387f81c672a4f5c06621000a6df0984cde689397d94Cary Clark                    foundBounds->fRight = foundBounds->fLeft + bounds.width();
388f81c672a4f5c06621000a6df0984cde689397d94Cary Clark                if (bounds.height() < foundBounds->height())
389f81c672a4f5c06621000a6df0984cde689397d94Cary Clark                    foundBounds->fBottom = foundBounds->fTop + bounds.height();
390f81c672a4f5c06621000a6df0984cde689397d94Cary Clark            }
39182f247bdbb98dd80c44209d87692c650c3704617Patrick Scott            return result;
392f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        }
39382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    }
394f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    if (parent->contentIsScrollable()) {
3954f91e5abbd847c4dee4740d3116f23b73bf02ee5Chris Craik        foundBounds->set(bounds.x(), bounds.y(), bounds.width(), bounds.height());
396fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott        return static_cast<const ScrollableLayerAndroid*>(parent);
397f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    }
39882f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    return 0;
39982f247bdbb98dd80c44209d87692c650c3704617Patrick Scott}
40082f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif
40182f247bdbb98dd80c44209d87692c650c3704617Patrick Scott
402f81c672a4f5c06621000a6df0984cde689397d94Cary Clarkint scrollableLayer(int x, int y, SkIRect* layerRect, SkIRect* bounds)
403a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{
40482f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if USE(ACCELERATED_COMPOSITING)
405885e650b12d781be054b31ae6221925a0184dc33Chris Craik    if (!m_baseLayer)
406a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        return 0;
407885e650b12d781be054b31ae6221925a0184dc33Chris Craik    const ScrollableLayerAndroid* result = findScrollableLayer(m_baseLayer, x, y, bounds);
40822e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott    if (result) {
40922e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott        result->getScrollRect(layerRect);
4108598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott        return result->uniqueId();
41122e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott    }
412a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#endif
413a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    return 0;
414a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott}
415a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott
41670adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craikvoid scrollLayer(int layerId, int x, int y)
41770adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik{
41870adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik    if (m_glWebViewState)
41970adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik        m_glWebViewState->scrollLayer(layerId, x, y);
42070adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik}
42170adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid setHeightCanMeasure(bool measure)
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_heightCanMeasure = measure;
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42787962ce00229855c098ba12cee8d5c015a835289Cary ClarkString getSelection()
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
429dea0c131566f424923425970fe5621305d136e5aJohn Reck    SelectText* select = static_cast<SelectText*>(
430dea0c131566f424923425970fe5621305d136e5aJohn Reck            getDrawExtra(WebView::DrawExtrasSelection));
431dea0c131566f424923425970fe5621305d136e5aJohn Reck    if (select)
432dea0c131566f424923425970fe5621305d136e5aJohn Reck        return select->getText();
433dea0c131566f424923425970fe5621305d136e5aJohn Reck    return String();
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43651c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scrogginsbool scrollBy(int dx, int dy)
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4386dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
441b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
442b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
443b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return false;
444b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    bool result = env->CallBooleanMethod(javaObject.get(), m_javaGlue.m_scrollBy, dx, dy, true);
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
44651c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins    return result;
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
449f51a51f6ea307f4311a04aa865a42b233269540bChris Craikvoid setIsScrolling(bool isScrolling)
450f51a51f6ea307f4311a04aa865a42b233269540bChris Craik{
451ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch#if USE(ACCELERATED_COMPOSITING)
452ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch    if (m_glWebViewState)
453ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch        m_glWebViewState->setIsScrolling(isScrolling);
454ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch#endif
455f51a51f6ea307f4311a04aa865a42b233269540bChris Craik}
456f51a51f6ea307f4311a04aa865a42b233269540bChris Craik
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid viewInvalidate()
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
460b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
461b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
462b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
463b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_viewInvalidate);
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid viewInvalidateRect(int l, int t, int r, int b)
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
470b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
471b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
472b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
473b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_viewInvalidateRect, l, r, t, b);
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid postInvalidateDelayed(int64_t delay, const WebCore::IntRect& bounds)
4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
480b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
481b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
482b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
483b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_postInvalidateDelayed,
4841ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block        delay, bounds.x(), bounds.y(), bounds.maxX(), bounds.maxY());
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48882f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL)
4895f4f4a8ff2154f3775ce5988565753b1a0b9c1b6John Reckstatic void copyScrollPosition(const LayerAndroid* fromRoot,
4905f4f4a8ff2154f3775ce5988565753b1a0b9c1b6John Reck                               LayerAndroid* toRoot, int layerId)
491a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{
4925f4f4a8ff2154f3775ce5988565753b1a0b9c1b6John Reck    if (!fromRoot || !toRoot)
493a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        return;
4945f4f4a8ff2154f3775ce5988565753b1a0b9c1b6John Reck    const LayerAndroid* from = fromRoot->findById(layerId);
4955f4f4a8ff2154f3775ce5988565753b1a0b9c1b6John Reck    LayerAndroid* to = toRoot->findById(layerId);
4965f4f4a8ff2154f3775ce5988565753b1a0b9c1b6John Reck    if (!from || !to || !from->contentIsScrollable() || !to->contentIsScrollable())
4975f4f4a8ff2154f3775ce5988565753b1a0b9c1b6John Reck        return;
4986184a1dfef36741a1e5602f5bf24ac99fcfa0aecJohn Reck    // TODO: Support this for iframes.
4996184a1dfef36741a1e5602f5bf24ac99fcfa0aecJohn Reck    if (to->isIFrameContent() || from->isIFrameContent())
5006184a1dfef36741a1e5602f5bf24ac99fcfa0aecJohn Reck        return;
5015f4f4a8ff2154f3775ce5988565753b1a0b9c1b6John Reck    to->setScrollOffset(from->getScrollOffset());
502a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott}
50382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif
504a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott
505885e650b12d781be054b31ae6221925a0184dc33Chris CraikBaseLayerAndroid* getBaseLayer() const { return m_baseLayer; }
506885e650b12d781be054b31ae6221925a0184dc33Chris Craik
50709bfbe67a95764c51124d12ac88a548e6238bdd1Chris Craikbool setBaseLayer(BaseLayerAndroid* newBaseLayer, bool showVisualIndicator,
5085f4f4a8ff2154f3775ce5988565753b1a0b9c1b6John Reck                  bool isPictureAfterFirstLayout, int scrollingLayer)
509f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{
510246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik    bool queueFull = false;
511a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
51209bfbe67a95764c51124d12ac88a548e6238bdd1Chris Craik    if (m_glWebViewState)
513885e650b12d781be054b31ae6221925a0184dc33Chris Craik        queueFull = m_glWebViewState->setBaseLayer(newBaseLayer, showVisualIndicator,
514246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik                                                   isPictureAfterFirstLayout);
515a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
516a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
51782f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL)
5185f4f4a8ff2154f3775ce5988565753b1a0b9c1b6John Reck    copyScrollPosition(m_baseLayer, newBaseLayer, scrollingLayer);
51982f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif
520b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger    SkSafeUnref(m_baseLayer);
521885e650b12d781be054b31ae6221925a0184dc33Chris Craik    m_baseLayer = newBaseLayer;
522246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik
523246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik    return queueFull;
5246d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
5256d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
5266d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobavoid copyBaseContentToPicture(SkPicture* picture)
5276d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
528261f89503d6606bb4896a4effe0ab4d5b4e01d8aChris Craik    if (!m_baseLayer || !m_baseLayer->content())
5296d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return;
530b3f4d3af0b06dc168453641e249d0cb9eec9b570Nicolas Roard    LayerContent* content = m_baseLayer->content();
53190ef829b3ebc2caca06ffb46dd587cca71456480Chris Craik    SkCanvas* canvas = picture->beginRecording(content->width(), content->height(),
53290ef829b3ebc2caca06ffb46dd587cca71456480Chris Craik                                              SkPicture::kUsePathBoundsForClip_RecordingFlag);
53390ef829b3ebc2caca06ffb46dd587cca71456480Chris Craik
53490ef829b3ebc2caca06ffb46dd587cca71456480Chris Craik    // clear the BaseLayerAndroid's previous matrix (set at each draw)
53590ef829b3ebc2caca06ffb46dd587cca71456480Chris Craik    SkMatrix baseMatrix;
53690ef829b3ebc2caca06ffb46dd587cca71456480Chris Craik    baseMatrix.reset();
53790ef829b3ebc2caca06ffb46dd587cca71456480Chris Craik    m_baseLayer->setMatrix(baseMatrix);
53890ef829b3ebc2caca06ffb46dd587cca71456480Chris Craik
53990ef829b3ebc2caca06ffb46dd587cca71456480Chris Craik    m_baseLayer->draw(canvas, 0);
54090ef829b3ebc2caca06ffb46dd587cca71456480Chris Craik
5416d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    picture->endRecording();
5426d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
5436d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
5446d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobabool hasContent() {
545261f89503d6606bb4896a4effe0ab4d5b4e01d8aChris Craik    if (!m_baseLayer || !m_baseLayer->content())
5466d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return false;
5476d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    return !m_baseLayer->content()->isEmpty();
548f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark}
549f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark
550908703e420f4931f74527aaeb3d5faabdd66c28aChet Haasevoid setFunctor(Functor* functor) {
551908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    delete m_glDrawFunctor;
552908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    m_glDrawFunctor = functor;
553908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}
554908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
555908703e420f4931f74527aaeb3d5faabdd66c28aChet HaaseFunctor* getFunctor() {
556908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    return m_glDrawFunctor;
557908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}
558908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
5599e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhuvoid setVisibleContentRect(SkRect& visibleContentRect) {
5609e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu    m_visibleContentRect = visibleContentRect;
561a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount}
562a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount
563dea0c131566f424923425970fe5621305d136e5aJohn Reckvoid setDrawExtra(DrawExtra *extra, DrawExtras type)
564dea0c131566f424923425970fe5621305d136e5aJohn Reck{
565dea0c131566f424923425970fe5621305d136e5aJohn Reck    if (type == DrawExtrasNone)
566dea0c131566f424923425970fe5621305d136e5aJohn Reck        return;
567dea0c131566f424923425970fe5621305d136e5aJohn Reck    DrawExtra* old = m_extras[type - 1];
568dea0c131566f424923425970fe5621305d136e5aJohn Reck    m_extras[type - 1] = extra;
569dea0c131566f424923425970fe5621305d136e5aJohn Reck    if (old != extra) {
570dea0c131566f424923425970fe5621305d136e5aJohn Reck        delete old;
571dea0c131566f424923425970fe5621305d136e5aJohn Reck    }
572dea0c131566f424923425970fe5621305d136e5aJohn Reck}
573dea0c131566f424923425970fe5621305d136e5aJohn Reck
574dea0c131566f424923425970fe5621305d136e5aJohn Reckvoid setTextSelection(SelectText *selection) {
575dea0c131566f424923425970fe5621305d136e5aJohn Reck    setDrawExtra(selection, DrawExtrasSelection);
576dea0c131566f424923425970fe5621305d136e5aJohn Reck}
577dea0c131566f424923425970fe5621305d136e5aJohn Reck
5781a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiwareconst TransformationMatrix* getLayerTransform(int layerId) {
5791a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware    if (layerId != -1 && m_baseLayer) {
5801a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware        LayerAndroid* layer = m_baseLayer->findById(layerId);
5811a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware        // We need to make sure the drawTransform is up to date as this is
5821a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware        // called before a draw() or drawGL()
5831a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware        if (layer) {
5840e43fd01178d539d44a5dfade3bf15aa6efbe02aGeorge Mount            m_baseLayer->updatePositionsRecursive(m_visibleContentRect);
5851a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware            return layer->drawTransform();
5861a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware        }
5871a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware    }
5881a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware    return 0;
5891a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware}
5901a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware
591304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mountint getHandleLayerId(SelectText::HandleId handleId, SkIPoint& cursorPoint,
592304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount        FloatQuad& textBounds) {
593dea0c131566f424923425970fe5621305d136e5aJohn Reck    SelectText* selectText = static_cast<SelectText*>(getDrawExtra(DrawExtrasSelection));
594fba5bad67c2589216f05da70a7f2fbd537637672John Reck    if (!selectText || !m_baseLayer)
595dea0c131566f424923425970fe5621305d136e5aJohn Reck        return -1;
596dea0c131566f424923425970fe5621305d136e5aJohn Reck    int layerId = selectText->caretLayerId(handleId);
597304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    IntRect cursorRect = selectText->caretRect(handleId);
598304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    IntRect textRect = selectText->textRect(handleId);
599304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    // Rects exclude the last pixel on right/bottom. We want only included pixels.
600304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    cursorPoint.set(cursorRect.x(), cursorRect.maxY() - 1);
6017f1e5ac384d6c663e2cb6b6bb7a58a300d16e1beGeorge Mount    textRect.setHeight(std::max(1, textRect.height() - 1));
6027f1e5ac384d6c663e2cb6b6bb7a58a300d16e1beGeorge Mount    textRect.setWidth(std::max(1, textRect.width() - 1));
603304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    textBounds = FloatQuad(textRect);
604304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount
6051a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware    const TransformationMatrix* transform = getLayerTransform(layerId);
6061a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware    if (transform) {
6071a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware        // We're overloading the concept of Rect to be just the two
6081a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware        // points (bottom-left and top-right.
6091a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware        cursorPoint = transform->mapPoint(cursorPoint);
6101a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware        textBounds = transform->mapQuad(textBounds);
611e5d643b22badb45c77ef040896bd8ac46edae7d0George Mount    }
612730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount    return layerId;
613730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount}
614730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount
615730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mountvoid mapLayerRect(int layerId, SkIRect& rect) {
6161a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware    const TransformationMatrix* transform = getLayerTransform(layerId);
6171a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware    if (transform)
6183ce211da38790a873931262f1a8d6806132680f4George Mount        rect = transform->mapRect(rect);
619dea0c131566f424923425970fe5621305d136e5aJohn Reck}
620dea0c131566f424923425970fe5621305d136e5aJohn Reck
621304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mountvoid floatQuadToQuadF(JNIEnv* env, const FloatQuad& nativeTextQuad,
622304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount        jobject textQuad)
623304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount{
624304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    jobject p1 = env->GetObjectField(textQuad, m_javaGlue.m_quadFP1);
625304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    jobject p2 = env->GetObjectField(textQuad, m_javaGlue.m_quadFP2);
626304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    jobject p3 = env->GetObjectField(textQuad, m_javaGlue.m_quadFP3);
627304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    jobject p4 = env->GetObjectField(textQuad, m_javaGlue.m_quadFP4);
628304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    GraphicsJNI::point_to_jpointf(nativeTextQuad.p1(), env, p1);
629304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    GraphicsJNI::point_to_jpointf(nativeTextQuad.p2(), env, p2);
630304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    GraphicsJNI::point_to_jpointf(nativeTextQuad.p3(), env, p3);
631304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    GraphicsJNI::point_to_jpointf(nativeTextQuad.p4(), env, p4);
632304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    env->DeleteLocalRef(p1);
633304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    env->DeleteLocalRef(p2);
634304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    env->DeleteLocalRef(p3);
635304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    env->DeleteLocalRef(p4);
636304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount}
637304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount
638a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck// This is called when WebView switches rendering modes in a more permanent fashion
639a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck// such as when the layer type is set or the view is attached/detached from the window
640a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reckint setHwAccelerated(bool hwAccelerated) {
641a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck    if (!m_glWebViewState)
642a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck        return 0;
643885e650b12d781be054b31ae6221925a0184dc33Chris Craik    LayerAndroid* root = m_baseLayer;
644a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck    if (root)
645a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck        return root->setHwAccelerated(hwAccelerated);
646a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck    return 0;
647a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck}
648a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck
64935caaaf726b8b17cec92747a1fe42dba44d6b775John Reckvoid setDrawingPaused(bool isPaused)
65035caaaf726b8b17cec92747a1fe42dba44d6b775John Reck{
65135caaaf726b8b17cec92747a1fe42dba44d6b775John Reck    m_isDrawingPaused = isPaused;
65235caaaf726b8b17cec92747a1fe42dba44d6b775John Reck    if (m_viewImpl)
65335caaaf726b8b17cec92747a1fe42dba44d6b775John Reck        m_viewImpl->setPrerenderingEnabled(!isPaused);
65435caaaf726b8b17cec92747a1fe42dba44d6b775John Reck}
65535caaaf726b8b17cec92747a1fe42dba44d6b775John Reck
656c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount// Finds the rectangles within world to the left, right, top, and bottom
657c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount// of rect and adds them to rects. If no intersection exists, false is returned.
658c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mountstatic bool findMaskedRects(const FloatRect& world,
659c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount        const FloatRect& rect, Vector<FloatRect>& rects) {
660c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    if (!world.intersects(rect))
661c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount        return false; // nothing to subtract
662c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount
663c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    // left rectangle
664c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    if (rect.x() > world.x())
665c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount        rects.append(FloatRect(world.x(), world.y(),
666c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount                rect.x() - world.x(), world.height()));
667c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    // top rectangle
668c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    if (rect.y() > world.y())
669c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount        rects.append(FloatRect(world.x(), world.y(),
670c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount                world.width(), rect.y() - world.y()));
671c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    // right rectangle
672c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    if (rect.maxX() < world.maxX())
673c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount        rects.append(FloatRect(rect.maxX(), world.y(),
674c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount                world.maxX() - rect.maxX(), world.height()));
675c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    // bottom rectangle
676c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    if (rect.maxY() < world.maxY())
677c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount        rects.append(FloatRect(world.x(), rect.maxY(),
678c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount                world.width(), world.maxY() - rect.maxY()));
679c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    return true;
680c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount}
681c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount
682c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount// Returns false if layerId is a fixed position layer, otherwise
683c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount// all fixed position layer rectangles are subtracted from those within
684c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount// rects. Rects will be modified to contain rectangles that don't include
685c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount// the fixed position layer rectangles.
686c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mountstatic bool findMaskedRectsForLayer(LayerAndroid* layer,
687c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount        Vector<FloatRect>& rects, int layerId)
688c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount{
689c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    if (layer->isPositionFixed()) {
690c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount        if (layerId == layer->uniqueId())
691c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount            return false;
692c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount        FloatRect layerRect = layer->fullContentAreaMapped();
693c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount        for (int i = rects.size() - 1; i >= 0; i--)
694c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount            if (findMaskedRects(rects[i], layerRect, rects))
695c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount                rects.remove(i);
696c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    }
697c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount
698c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    int childIndex = 0;
699c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    while (LayerAndroid* child = layer->getChild(childIndex++))
700c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount        if (!findMaskedRectsForLayer(child, rects, layerId))
701c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount            return false;
702c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount
703c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    return true;
704c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount}
705c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount
706c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount// Finds the largest rectangle not masked by any fixed layer.
707c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mountvoid findMaxVisibleRect(int movingLayerId, SkIRect& visibleContentRect)
708c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount{
709c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    if (!m_baseLayer)
710c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount        return;
711c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount
712c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    FloatRect visibleContentFloatRect(visibleContentRect);
713c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    m_baseLayer->updatePositionsRecursive(visibleContentFloatRect);
714c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    Vector<FloatRect> rects;
715c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    rects.append(visibleContentFloatRect);
716c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    if (findMaskedRectsForLayer(m_baseLayer, rects, movingLayerId)) {
717c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount        float maxSize = 0.0;
718c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount        const FloatRect* largest = 0;
7190a6f5b9fdd5bfd7a03fa0da1f1fafccc5a65d091George Mount        for (unsigned int i = 0; i < rects.size(); i++) {
720c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount            const FloatRect& rect = rects[i];
721c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount            float size = rect.width() * rect.height();
722c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount            if (size > maxSize) {
723c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount                maxSize = size;
724c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount                largest = &rect;
725c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount            }
726c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount        }
727c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount        if (largest) {
728c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount            SkRect largeRect = *largest;
729c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount            largeRect.round(&visibleContentRect);
730c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount        }
731c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    }
732c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount}
733c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount
7342d66db6bf0f6f3687361cce7d9280de47ed591eeGeorge Mountbool isHandleLeft(SelectText::HandleId handleId)
7352d66db6bf0f6f3687361cce7d9280de47ed591eeGeorge Mount{
7362d66db6bf0f6f3687361cce7d9280de47ed591eeGeorge Mount    SelectText* selectText = static_cast<SelectText*>(getDrawExtra(DrawExtrasSelection));
7372d66db6bf0f6f3687361cce7d9280de47ed591eeGeorge Mount    if (!selectText)
7382d66db6bf0f6f3687361cce7d9280de47ed591eeGeorge Mount        return (handleId == SelectText::BaseHandle);
7392d66db6bf0f6f3687361cce7d9280de47ed591eeGeorge Mount
7402d66db6bf0f6f3687361cce7d9280de47ed591eeGeorge Mount    return (selectText->getHandleType(handleId) == SelectText::LeftHandle);
7412d66db6bf0f6f3687361cce7d9280de47ed591eeGeorge Mount}
7422d66db6bf0f6f3687361cce7d9280de47ed591eeGeorge Mount
7436858906040a8e78210021ba85b62c59a193654deGeorge Mountbool isPointVisible(int layerId, int contentX, int contentY)
7446858906040a8e78210021ba85b62c59a193654deGeorge Mount{
7456858906040a8e78210021ba85b62c59a193654deGeorge Mount    bool isVisible = true;
7466858906040a8e78210021ba85b62c59a193654deGeorge Mount    const TransformationMatrix* transform = getLayerTransform(layerId);
7476858906040a8e78210021ba85b62c59a193654deGeorge Mount    if (transform) {
7486858906040a8e78210021ba85b62c59a193654deGeorge Mount        // layer is guaranteed to be non-NULL because of getLayerTransform
7496858906040a8e78210021ba85b62c59a193654deGeorge Mount        LayerAndroid* layer = m_baseLayer->findById(layerId);
7506858906040a8e78210021ba85b62c59a193654deGeorge Mount        IntRect rect = layer->visibleContentArea();
7516858906040a8e78210021ba85b62c59a193654deGeorge Mount        rect = transform->mapRect(rect);
7526858906040a8e78210021ba85b62c59a193654deGeorge Mount        isVisible = rect.contains(contentX, contentY);
7536858906040a8e78210021ba85b62c59a193654deGeorge Mount    }
7546858906040a8e78210021ba85b62c59a193654deGeorge Mount    return isVisible;
7556858906040a8e78210021ba85b62c59a193654deGeorge Mount}
7566858906040a8e78210021ba85b62c59a193654deGeorge Mount
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate: // local state for WebView
75835caaaf726b8b17cec92747a1fe42dba44d6b775John Reck    bool m_isDrawingPaused;
7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // private to getFrameCache(); other functions operate in a different thread
7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebViewCore* m_viewImpl;
7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int m_generation; // associate unique ID with sent kit focus to match with ui
7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Corresponds to the same-named boolean on the java side.
7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_heightCanMeasure;
7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int m_lastDx;
7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkMSec m_lastDxTime;
766dea0c131566f424923425970fe5621305d136e5aJohn Reck    DrawExtra* m_extras[DRAW_EXTRAS_SIZE];
7676d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    BaseLayerAndroid* m_baseLayer;
768908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    Functor* m_glDrawFunctor;
769a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
770c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    GLWebViewState* m_glWebViewState;
771a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
7729e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu    SkRect m_visibleContentRect;
77355b4bdbd661ac94fd05ab40de08250bf242d5346John Reck    bool m_isHighEndGfx;
7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; // end of WebView class
7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
776908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
777908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase/**
778908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * This class holds a function pointer and parameters for calling drawGL into a specific
779908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * viewport. The pointer to the Functor will be put on a framework display list to be called
780908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * when the display list is replayed.
781908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase */
782908703e420f4931f74527aaeb3d5faabdd66c28aChet Haaseclass GLDrawFunctor : Functor {
783908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    public:
784908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    GLDrawFunctor(WebView* _wvInstance,
785bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu            int (WebView::*_funcPtr)(WebCore::IntRect&, WebCore::IntRect*,
786bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu                    WebCore::IntRect&, int, WebCore::IntRect&, jfloat, jint, bool),
7879e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu            WebCore::IntRect _invScreenRect, float _scale, int _extras) {
788908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        wvInstance = _wvInstance;
789908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        funcPtr = _funcPtr;
7909e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu        invScreenRect = _invScreenRect;
791908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        scale = _scale;
792908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        extras = _extras;
793908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    };
79409bfbe67a95764c51124d12ac88a548e6238bdd1Chris Craik
79579d8e0434bfe00a793e8041f96dc02ec1d98e694Romain Guy    status_t operator()(int messageId, void* data) {
796d71bb71a2be8c0f7eff98c981a5410aa49e04843Chris Craik        TRACE_METHOD();
797be2aeb9261649a2c724b324611e75f5d69cf3baeTeng-Hui Zhu        bool shouldDraw = (messageId == uirenderer::DrawGlInfo::kModeDraw);
798be2aeb9261649a2c724b324611e75f5d69cf3baeTeng-Hui Zhu        if (shouldDraw)
799be2aeb9261649a2c724b324611e75f5d69cf3baeTeng-Hui Zhu            wvInstance->updateRectsForGL();
800d71bb71a2be8c0f7eff98c981a5410aa49e04843Chris Craik
80129e99f5f6697f79eb9f402175456f40c73f4fc9cTeng-Hui Zhu        if (invScreenRect.isEmpty()) {
80229e99f5f6697f79eb9f402175456f40c73f4fc9cTeng-Hui Zhu            // NOOP operation if viewport is empty
80329e99f5f6697f79eb9f402175456f40c73f4fc9cTeng-Hui Zhu            return 0;
80429e99f5f6697f79eb9f402175456f40c73f4fc9cTeng-Hui Zhu        }
80529e99f5f6697f79eb9f402175456f40c73f4fc9cTeng-Hui Zhu
8069f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard        WebCore::IntRect inval;
8079e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu        int titlebarHeight = screenRect.height() - invScreenRect.height();
808b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner
809b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner        uirenderer::DrawGlInfo* info = reinterpret_cast<uirenderer::DrawGlInfo*>(data);
8109e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu        WebCore::IntRect screenClip(info->clipLeft, info->clipTop,
8119e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu                                    info->clipRight - info->clipLeft,
8129e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu                                    info->clipBottom - info->clipTop);
813d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu
8149e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu        WebCore::IntRect localInvScreenRect = invScreenRect;
815d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu        if (info->isLayer) {
816d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu            // When webview is on a layer, we need to use the viewport relative
8179e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu            // to the FBO, rather than the screen(which will use invScreenRect).
8189e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu            localInvScreenRect.setX(screenClip.x());
8199e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu            localInvScreenRect.setY(info->height - screenClip.y() - screenClip.height());
820d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu        }
821868c42d56aae84ed4cd33f9de0d93132e1483ddcTeng-Hui Zhu        // Send the necessary info to the shader.
822868c42d56aae84ed4cd33f9de0d93132e1483ddcTeng-Hui Zhu        TilesManager::instance()->shader()->setGLDrawInfo(info);
823868c42d56aae84ed4cd33f9de0d93132e1483ddcTeng-Hui Zhu
8249e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu        int returnFlags = (*wvInstance.*funcPtr)(localInvScreenRect, &inval, screenRect,
8259e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu                titlebarHeight, screenClip, scale, extras, shouldDraw);
826bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu        if ((returnFlags & uirenderer::DrawGlInfo::kStatusDraw) != 0) {
8279f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard            IntRect finalInval;
828bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu            if (inval.isEmpty())
8299e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu                finalInval = screenRect;
830bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu            else {
8319e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu                finalInval.setX(screenRect.x() + inval.x());
8329e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu                finalInval.setY(screenRect.y() + titlebarHeight + inval.y());
8339f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard                finalInval.setWidth(inval.width());
8349f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard                finalInval.setHeight(inval.height());
8359f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard            }
836d1f5cf1ad8b20860bd9cb34a483451019124d1f9Romain Guy            info->dirtyLeft = finalInval.x();
837d1f5cf1ad8b20860bd9cb34a483451019124d1f9Romain Guy            info->dirtyTop = finalInval.y();
8381ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block            info->dirtyRight = finalInval.maxX();
8391ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block            info->dirtyBottom = finalInval.maxY();
840b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy        }
841bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu        // return 1 if invalidation needed, 2 to request non-drawing functor callback, 0 otherwise
842bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu        ALOGV("returnFlags are %d, shouldDraw %d", returnFlags, shouldDraw);
843bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu        return returnFlags;
844908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    }
8459e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu    void updateScreenRect(WebCore::IntRect& _screenRect) {
8469e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu        screenRect = _screenRect;
847908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    }
8489e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu    void updateInvScreenRect(WebCore::IntRect& _invScreenRect) {
8499e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu        invScreenRect = _invScreenRect;
850b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy    }
851d0a011b30b97598ee74f329aaa217a6ab733f1f1Teng-Hui Zhu    void updateScale(float _scale) {
852d0a011b30b97598ee74f329aaa217a6ab733f1f1Teng-Hui Zhu        scale = _scale;
853d0a011b30b97598ee74f329aaa217a6ab733f1f1Teng-Hui Zhu    }
854efb1906816d97165a353b40f65ea0b057f6c8fe0Chris Craik    void updateExtras(jint _extras) {
855efb1906816d97165a353b40f65ea0b057f6c8fe0Chris Craik        extras = _extras;
856efb1906816d97165a353b40f65ea0b057f6c8fe0Chris Craik    }
857908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    private:
858908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    WebView* wvInstance;
859bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu    int (WebView::*funcPtr)(WebCore::IntRect&, WebCore::IntRect*,
860bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu            WebCore::IntRect&, int, WebCore::IntRect&, float, int, bool);
8619e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu    WebCore::IntRect invScreenRect;
8629e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu    WebCore::IntRect screenRect;
863908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    jfloat scale;
864908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    jint extras;
865908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase};
866908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Native JNI methods
8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
87155b4bdbd661ac94fd05ab40de08250bf242d5346John Reckstatic void nativeCreate(JNIEnv *env, jobject obj, int viewImpl,
87255b4bdbd661ac94fd05ab40de08250bf242d5346John Reck                         jstring drawableDir, jboolean isHighEndGfx)
8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8744de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins    WTF::String dir = jstringToWtfString(env, drawableDir);
875894aaa1bd5446eebf8169efa1998fbe6964c18d0Chris Craik    new WebView(env, obj, viewImpl, dir, isHighEndGfx);
8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // NEED THIS OR SOMETHING LIKE IT!
8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //Release(obj);
8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
88046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic WebCore::IntRect jrect_to_webrect(JNIEnv* env, jobject obj)
88146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
882a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    if (obj) {
883a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        int L, T, R, B;
884a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        GraphicsJNI::get_jrect(env, obj, &L, &T, &R, &B);
885a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        return WebCore::IntRect(L, T, R - L, B - T);
886a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    } else
887a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        return WebCore::IntRect();
888a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount}
889a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount
890a5e649bc4d58bf3da959deae077307c487e2a3a6George Mountstatic SkRect jrectf_to_rect(JNIEnv* env, jobject obj)
891a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount{
892a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    SkRect rect = SkRect::MakeEmpty();
893a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    if (obj)
894a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        GraphicsJNI::jrectf_to_rect(env, obj, &rect);
895a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    return rect;
89646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
89746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
898e859a34171f2a36877d95197d118d962078f8aa0John Reckstatic void nativeDraw(JNIEnv *env, jobject obj, jobject canv,
899a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        jobject visible, jint color,
900e859a34171f2a36877d95197d118d962078f8aa0John Reck        jint extras) {
9018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkCanvas* canvas = GraphicsJNI::getNativeCanvas(env, canv);
902a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    WebView* webView = GET_NATIVE_VIEW(env, obj);
9039e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu    SkRect visibleContentRect = jrectf_to_rect(env, visible);
9049e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu    webView->setVisibleContentRect(visibleContentRect);
905e859a34171f2a36877d95197d118d962078f8aa0John Reck    webView->draw(canvas, color, static_cast<WebView::DrawExtras>(extras));
9068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
90824b412c6f16018a2a2971eef09648ce105ef618aChris Craikstatic jint nativeCreateDrawGLFunction(JNIEnv *env, jobject obj, jint nativeView,
9099e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu                                       jobject jinvscreenrect, jobject jscreenrect,
9109e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu                                       jobject jvisiblecontentrect,
9119e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu                                       jfloat scale, jint extras) {
9129e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu    WebCore::IntRect invScreenRect = jrect_to_webrect(env, jinvscreenrect);
9130c98d349b66fb7649824d019023aa64b4a2e80f7Chris Craik    WebView *wvInstance = reinterpret_cast<WebView*>(nativeView);
9149e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu    SkRect visibleContentRect = jrectf_to_rect(env, jvisiblecontentrect);
9159e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu    wvInstance->setVisibleContentRect(visibleContentRect);
916a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount
917efb1906816d97165a353b40f65ea0b057f6c8fe0Chris Craik    GLDrawFunctor* functor = (GLDrawFunctor*) wvInstance->getFunctor();
918efb1906816d97165a353b40f65ea0b057f6c8fe0Chris Craik    if (!functor) {
919efb1906816d97165a353b40f65ea0b057f6c8fe0Chris Craik        functor = new GLDrawFunctor(wvInstance, &android::WebView::drawGL,
9209e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu                                    invScreenRect, scale, extras);
921efb1906816d97165a353b40f65ea0b057f6c8fe0Chris Craik        wvInstance->setFunctor((Functor*) functor);
922efb1906816d97165a353b40f65ea0b057f6c8fe0Chris Craik    } else {
9239e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu        functor->updateInvScreenRect(invScreenRect);
924efb1906816d97165a353b40f65ea0b057f6c8fe0Chris Craik        functor->updateScale(scale);
925efb1906816d97165a353b40f65ea0b057f6c8fe0Chris Craik        functor->updateExtras(extras);
926efb1906816d97165a353b40f65ea0b057f6c8fe0Chris Craik    }
927b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy
9289e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu    WebCore::IntRect rect = jrect_to_webrect(env, jscreenrect);
9299e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu    functor->updateScreenRect(rect);
930b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy
931908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    return (jint)functor;
932908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}
933908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
93424b412c6f16018a2a2971eef09648ce105ef618aChris Craikstatic jint nativeGetDrawGLFunction(JNIEnv *env, jobject obj, jint nativeView) {
9350c98d349b66fb7649824d019023aa64b4a2e80f7Chris Craik    WebView *wvInstance = reinterpret_cast<WebView*>(nativeView);
93624b412c6f16018a2a2971eef09648ce105ef618aChris Craik    if (!wvInstance)
93724b412c6f16018a2a2971eef09648ce105ef618aChris Craik        return 0;
93824b412c6f16018a2a2971eef09648ce105ef618aChris Craik
93924b412c6f16018a2a2971eef09648ce105ef618aChris Craik    return (jint) wvInstance->getFunctor();
94024b412c6f16018a2a2971eef09648ce105ef618aChris Craik}
94124b412c6f16018a2a2971eef09648ce105ef618aChris Craik
9429e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhustatic void nativeUpdateDrawGLFunction(JNIEnv *env, jobject obj, jint nativeView,
9439e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu                                       jobject jinvscreenrect, jobject jscreenrect,
9449e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu                                       jobject jvisiblecontentrect, jfloat scale) {
9450c98d349b66fb7649824d019023aa64b4a2e80f7Chris Craik    WebView *wvInstance = reinterpret_cast<WebView*>(nativeView);
946a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    if (wvInstance) {
947908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        GLDrawFunctor* functor = (GLDrawFunctor*) wvInstance->getFunctor();
948a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        if (functor) {
9499e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu            WebCore::IntRect invScreenRect = jrect_to_webrect(env, jinvscreenrect);
9509e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu            functor->updateInvScreenRect(invScreenRect);
951b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy
9529e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu            SkRect visibleContentRect = jrectf_to_rect(env, jvisiblecontentrect);
9539e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu            wvInstance->setVisibleContentRect(visibleContentRect);
954a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount
9559e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu            WebCore::IntRect screenRect = jrect_to_webrect(env, jscreenrect);
9569e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu            functor->updateScreenRect(screenRect);
957d0a011b30b97598ee74f329aaa217a6ab733f1f1Teng-Hui Zhu
958d0a011b30b97598ee74f329aaa217a6ab733f1f1Teng-Hui Zhu            functor->updateScale(scale);
959908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        }
960908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    }
961908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}
962908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
963223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reckstatic bool nativeEvaluateLayersAnimations(JNIEnv *env, jobject obj, jint nativeView)
964797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{
965c6151a04881a67d08d91237891fbc7cb82927219John Reck    // only call in software rendering, initialize and evaluate animations
966797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#if USE(ACCELERATED_COMPOSITING)
9670c98d349b66fb7649824d019023aa64b4a2e80f7Chris Craik    BaseLayerAndroid* baseLayer = reinterpret_cast<WebView*>(nativeView)->getBaseLayer();
968885e650b12d781be054b31ae6221925a0184dc33Chris Craik    if (baseLayer) {
969885e650b12d781be054b31ae6221925a0184dc33Chris Craik        baseLayer->initAnimations();
970885e650b12d781be054b31ae6221925a0184dc33Chris Craik        return baseLayer->evaluateAnimations();
971c6151a04881a67d08d91237891fbc7cb82927219John Reck    }
972797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#endif
973797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard    return false;
974797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard}
975797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard
97609bfbe67a95764c51124d12ac88a548e6238bdd1Chris Craikstatic bool nativeSetBaseLayer(JNIEnv *env, jobject obj, jint nativeView, jint layer,
977246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik                               jboolean showVisualIndicator,
9785f4f4a8ff2154f3775ce5988565753b1a0b9c1b6John Reck                               jboolean isPictureAfterFirstLayout,
9795f4f4a8ff2154f3775ce5988565753b1a0b9c1b6John Reck                               jint scrollingLayer)
980f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{
9816d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    BaseLayerAndroid* layerImpl = reinterpret_cast<BaseLayerAndroid*>(layer);
9820c98d349b66fb7649824d019023aa64b4a2e80f7Chris Craik    return reinterpret_cast<WebView*>(nativeView)->setBaseLayer(layerImpl, showVisualIndicator,
9835f4f4a8ff2154f3775ce5988565753b1a0b9c1b6John Reck                                                                isPictureAfterFirstLayout,
9845f4f4a8ff2154f3775ce5988565753b1a0b9c1b6John Reck                                                                scrollingLayer);
9856d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
9866d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
9870c98d349b66fb7649824d019023aa64b4a2e80f7Chris Craikstatic BaseLayerAndroid* nativeGetBaseLayer(JNIEnv *env, jobject obj, jint nativeView)
9884212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck{
9890c98d349b66fb7649824d019023aa64b4a2e80f7Chris Craik    return reinterpret_cast<WebView*>(nativeView)->getBaseLayer();
9904212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck}
9914212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck
9926d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic void nativeCopyBaseContentToPicture(JNIEnv *env, jobject obj, jobject pict)
9936d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
9946d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    SkPicture* picture = GraphicsJNI::getNativePicture(env, pict);
9956d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    GET_NATIVE_VIEW(env, obj)->copyBaseContentToPicture(picture);
9966d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
9976d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
998cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reckstatic jboolean nativeDumpLayerContentToPicture(JNIEnv *env, jobject obj, jint instance,
999cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reck                                                jstring jclassName, jint layerId, jobject pict)
1000cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reck{
1001cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reck    bool success = false;
1002cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reck    SkPicture* picture = GraphicsJNI::getNativePicture(env, pict);
1003cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reck    std::string classname = jstringToStdString(env, jclassName);
1004cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reck    BaseLayerAndroid* baseLayer = reinterpret_cast<WebView*>(instance)->getBaseLayer();
1005cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reck    LayerAndroid* layer = baseLayer->findById(layerId);
1006cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reck    SkSafeRef(layer);
1007cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reck    if (layer && layer->subclassName() == classname) {
1008cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reck        LayerContent* content = layer->content();
1009cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reck        if (content) {
1010cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reck            SkCanvas* canvas = picture->beginRecording(content->width(), content->height());
1011cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reck            content->draw(canvas);
1012cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reck            picture->endRecording();
1013cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reck            success = true;
1014cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reck        }
1015cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reck    }
1016cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reck    SkSafeUnref(layer);
1017cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reck    return success;
1018cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reck}
1019cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reck
10206d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic bool nativeHasContent(JNIEnv *env, jobject obj)
10216d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
10226d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    return GET_NATIVE_VIEW(env, obj)->hasContent();
1023f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark}
1024f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark
10258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeSetHeightCanMeasure(JNIEnv *env, jobject obj, bool measure)
10268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
10286dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(view, "view not set in nativeSetHeightCanMeasure");
10298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    view->setHeightCanMeasure(measure);
10308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1032f8f128dcb4ac3fe0ec6d81d1dcd0b15eb2380f6aJohn Reckstatic void nativeDestroy(JNIEnv *env, jobject obj, jint ptr)
10338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1034f8f128dcb4ac3fe0ec6d81d1dcd0b15eb2380f6aJohn Reck    WebView* view = reinterpret_cast<WebView*>(ptr);
1035a09e7cf49f43950a799f936bf42a9912d696547bSteve Block    ALOGD("nativeDestroy view: %p", view);
10366dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(view, "view not set in nativeDestroy");
10378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete view;
10388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1040f8f128dcb4ac3fe0ec6d81d1dcd0b15eb2380f6aJohn Reckstatic void nativeStopGL(JNIEnv *env, jobject obj, jint ptr)
10418360bc9c9facd690e42379610cbbb368d3d705efCary Clark{
1042f8f128dcb4ac3fe0ec6d81d1dcd0b15eb2380f6aJohn Reck    if (ptr)
1043f8f128dcb4ac3fe0ec6d81d1dcd0b15eb2380f6aJohn Reck        reinterpret_cast<WebView*>(ptr)->stopGL();
10448360bc9c9facd690e42379610cbbb368d3d705efCary Clark}
10458360bc9c9facd690e42379610cbbb368d3d705efCary Clark
10468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jobject nativeGetSelection(JNIEnv *env, jobject obj)
10478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
10496dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(view, "view not set in %s", __FUNCTION__);
10505e5962825729a211e093fd615ddc9e5b0bec10bdCary Clark    String selection = view->getSelection();
105179b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block    return wtfStringToJstring(env, selection);
10528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1054a3a38731f4eeb01d2a42965b6c875d957999969dChris Craikstatic void nativeDiscardAllTextures(JNIEnv *env, jobject obj)
1055a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik{
1056a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik    //discard all textures for debugging/test purposes, but not gl backing memory
1057a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik    bool allTextures = true, deleteGLTextures = false;
1058a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik    TilesManager::instance()->discardTextures(allTextures, deleteGLTextures);
1059af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik}
1060af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik
10615dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic void nativeTileProfilingStart(JNIEnv *env, jobject obj)
10625dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
1063687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    TilesManager::instance()->getProfiler()->start();
10645dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
10655dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
10665dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic float nativeTileProfilingStop(JNIEnv *env, jobject obj)
10675dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
1068687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    return TilesManager::instance()->getProfiler()->stop();
10695dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
10705dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
10715dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic void nativeTileProfilingClear(JNIEnv *env, jobject obj)
10725dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
1073687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    TilesManager::instance()->getProfiler()->clear();
10745dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
10755dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
10765dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic int nativeTileProfilingNumFrames(JNIEnv *env, jobject obj)
10775dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
1078687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    return TilesManager::instance()->getProfiler()->numFrames();
10795dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
10805dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
10815dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic int nativeTileProfilingNumTilesInFrame(JNIEnv *env, jobject obj, int frame)
10825dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
1083687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    return TilesManager::instance()->getProfiler()->numTilesInFrame(frame);
10845dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
10855dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
1086687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craikstatic int nativeTileProfilingGetInt(JNIEnv *env, jobject obj, int frame, int tile, jstring jkey)
10875dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
1088687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    WTF::String key = jstringToWtfString(env, jkey);
1089687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    TileProfileRecord* record = TilesManager::instance()->getProfiler()->getTile(frame, tile);
1090687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik
1091687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    if (key == "left")
1092687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        return record->left;
1093687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    if (key == "top")
1094687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        return record->top;
1095687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    if (key == "right")
1096687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        return record->right;
1097687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    if (key == "bottom")
1098687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        return record->bottom;
1099687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    if (key == "level")
1100687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        return record->level;
1101687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    if (key == "isReady")
1102687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        return record->isReady ? 1 : 0;
1103687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    return -1;
11045dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
11055dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
1106687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craikstatic float nativeTileProfilingGetFloat(JNIEnv *env, jobject obj, int frame, int tile, jstring jkey)
11075dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
1108687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    TileProfileRecord* record = TilesManager::instance()->getProfiler()->getTile(frame, tile);
1109687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    return record->scale;
11105dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
11115dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
11128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_DUMP_DISPLAY_TREE
11138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void dumpToFile(const char text[], void* file) {
11148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fwrite(text, 1, strlen(text), reinterpret_cast<FILE*>(file));
11158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fwrite("\n", 1, 1, reinterpret_cast<FILE*>(file));
11168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
11188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1119c2992cfb02b098d6e8579b6a0ba7f7a11c7753feJohn Reck// Return true to view invalidate WebView
1120f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roardstatic bool nativeSetProperty(JNIEnv *env, jobject obj, jstring jkey, jstring jvalue)
1121d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck{
1122d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck    WTF::String key = jstringToWtfString(env, jkey);
1123d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck    WTF::String value = jstringToWtfString(env, jvalue);
1124ef238925ea0ba6305e4540aff5c6953503993f3bNicolas Roard    if (key == "inverted") {
1125bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik        bool shouldInvert = (value == "true");
1126bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik        TilesManager::instance()->setInvertedScreen(shouldInvert);
1127f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard        return true;
1128d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck    }
11298852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu    else if (key == "inverted_contrast") {
1130bbb9caa2571e2c0192861a336c358412e9e7f0c7Nicolas Roard        float contrast = value.toFloat();
1131bbb9caa2571e2c0192861a336c358412e9e7f0c7Nicolas Roard        TilesManager::instance()->setInvertedScreenContrast(contrast);
1132f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard        return true;
1133bbb9caa2571e2c0192861a336c358412e9e7f0c7Nicolas Roard    }
11348852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu    else if (key == "enable_cpu_upload_path") {
11350960fe0e966317c4728542e9cfaa259523665900Teng-Hui Zhu        TilesManager::instance()->transferQueue()->setTextureUploadType(
11360960fe0e966317c4728542e9cfaa259523665900Teng-Hui Zhu            value == "true" ? CpuUpload : GpuUpload);
11370960fe0e966317c4728542e9cfaa259523665900Teng-Hui Zhu    }
11388852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu    else if (key == "use_minimal_memory") {
11398852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu        TilesManager::instance()->setUseMinimalMemory(value == "true");
11408852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu    }
1141bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik    else if (key == "use_double_buffering") {
1142bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik        TilesManager::instance()->setUseDoubleBuffering(value == "true");
1143bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik    }
1144bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik    else if (key == "tree_updates") {
1145d8be9016b7fda67a91b4ee17b3b2e7ba692ee553Chris Craik        TilesManager::instance()->clearContentUpdates();
1146bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik    }
1147f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard    return false;
1148d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck}
1149d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck
1150bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craikstatic jstring nativeGetProperty(JNIEnv *env, jobject obj, jstring jkey)
1151d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck{
1152bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik    WTF::String key = jstringToWtfString(env, jkey);
1153bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik    if (key == "tree_updates") {
1154d8be9016b7fda67a91b4ee17b3b2e7ba692ee553Chris Craik        int updates = TilesManager::instance()->getContentUpdates();
1155bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik        WTF::String wtfUpdates = WTF::String::number(updates);
1156bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik        return wtfStringToJstring(env, wtfUpdates);
1157bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik    }
1158d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck    return 0;
1159d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck}
1160d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck
116152f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reckstatic void nativeOnTrimMemory(JNIEnv *env, jobject obj, jint level)
116252f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck{
11632986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik    if (TilesManager::hardwareAccelerationEnabled()) {
1164e1dfe84b38ed080c7bb7ac00fd9e3c6c590a147dTeng-Hui Zhu        // When we got TRIM_MEMORY_MODERATE or TRIM_MEMORY_COMPLETE, we should
1165e1dfe84b38ed080c7bb7ac00fd9e3c6c590a147dTeng-Hui Zhu        // make sure the transfer queue is empty and then abandon the Surface
1166e1dfe84b38ed080c7bb7ac00fd9e3c6c590a147dTeng-Hui Zhu        // Texture to avoid ANR b/c framework may destroy the EGL context.
1167e1dfe84b38ed080c7bb7ac00fd9e3c6c590a147dTeng-Hui Zhu        // Refer to WindowManagerImpl.java for conditions we followed.
116800144be011338276839a08a66ae79b14629b268bTeng-Hui Zhu        TilesManager* tilesManager = TilesManager::instance();
1169d2339fb5509a885ab17100ead6b3a543e7d4d7f7Teng-Hui Zhu        if ((level >= TRIM_MEMORY_MODERATE
1170d2339fb5509a885ab17100ead6b3a543e7d4d7f7Teng-Hui Zhu            && !tilesManager->highEndGfx())
1171d2339fb5509a885ab17100ead6b3a543e7d4d7f7Teng-Hui Zhu            || level >= TRIM_MEMORY_COMPLETE) {
11720f1c02efd8cc889db10575dff2749d103ceeaf87Teng-Hui Zhu            ALOGD("OnTrimMemory with EGL Context %p", eglGetCurrentContext());
11732ac76fe4e18c3325c8b3bb8f9435fdc7b96c0acaTeng-Hui Zhu            tilesManager->cleanupGLResources();
1174886eb87d34570b706a0f17fa944d98870ed6a2afTeng-Hui Zhu        }
1175e1dfe84b38ed080c7bb7ac00fd9e3c6c590a147dTeng-Hui Zhu
1176a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik        bool freeAllTextures = (level > TRIM_MEMORY_UI_HIDDEN), glTextures = true;
117700144be011338276839a08a66ae79b14629b268bTeng-Hui Zhu        tilesManager->discardTextures(freeAllTextures, glTextures);
11782986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik    }
117952f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck}
118052f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck
11818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeDumpDisplayTree(JNIEnv* env, jobject jwebview, jstring jurl)
11828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
11838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_DUMP_DISPLAY_TREE
11848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, jwebview);
11856dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(view, "view not set in %s", __FUNCTION__);
11868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1187bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed    if (view && view->getWebViewCore()) {
1188bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed        FILE* file = fopen(DISPLAY_TREE_LOG_FILE, "w");
1189bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed        if (file) {
1190bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            SkFormatDumper dumper(dumpToFile, file);
1191bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // dump the URL
1192bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            if (jurl) {
1193bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed                const char* str = env->GetStringUTFChars(jurl, 0);
1194bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed                SkDebugf("Dumping %s to %s\n", str, DISPLAY_TREE_LOG_FILE);
1195bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed                dumpToFile(str, file);
1196bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed                env->ReleaseStringUTFChars(jurl, str);
11978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
1198bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // now dump the display tree
1199bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            SkDumpCanvas canvas(&dumper);
1200bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // this will playback the picture into the canvas, which will
1201bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // spew its contents to the dumper
1202e859a34171f2a36877d95197d118d962078f8aa0John Reck            view->draw(&canvas, 0, WebView::DrawExtrasNone);
1203bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // we're done with the file now
1204bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            fwrite("\n", 1, 1, file);
1205bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            fclose(file);
12068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1207859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
1208885e650b12d781be054b31ae6221925a0184dc33Chris Craik        const LayerAndroid* baseLayer = view->getBaseLayer();
1209885e650b12d781be054b31ae6221925a0184dc33Chris Craik        if (baseLayer) {
1210859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard          FILE* file = fopen(LAYERS_TREE_LOG_FILE,"w");
1211859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard          if (file) {
1212cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reck              WebCore::FileLayerDumper dumper(file);
1213cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reck              baseLayer->dumpLayers(&dumper);
1214859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard              fclose(file);
1215859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard          }
1216859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard        }
1217859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard#endif
12188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
12208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1222480a11521105a40ffab843d4903473a7de4cddcaChris Craikstatic int nativeScrollableLayer(JNIEnv* env, jobject jwebview, jint nativeView,
1223480a11521105a40ffab843d4903473a7de4cddcaChris Craik    jint x, jint y, jobject rect, jobject bounds)
1224a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{
1225480a11521105a40ffab843d4903473a7de4cddcaChris Craik    WebView* webview = reinterpret_cast<WebView*>(nativeView);
1226480a11521105a40ffab843d4903473a7de4cddcaChris Craik    ALOG_ASSERT(webview, "webview not set in %s", __FUNCTION__);
1227f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    SkIRect nativeRect, nativeBounds;
1228480a11521105a40ffab843d4903473a7de4cddcaChris Craik    int id = webview->scrollableLayer(x, y, &nativeRect, &nativeBounds);
1229f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins    if (rect)
1230f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins        GraphicsJNI::irect_to_jrect(nativeRect, env, rect);
1231f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins    if (bounds)
1232f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins        GraphicsJNI::irect_to_jrect(nativeBounds, env, bounds);
123322e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott    return id;
1234a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott}
1235a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott
1236480a11521105a40ffab843d4903473a7de4cddcaChris Craikstatic bool nativeScrollLayer(JNIEnv* env, jobject obj,
1237480a11521105a40ffab843d4903473a7de4cddcaChris Craik    jint nativeView, jint layerId, jint x, jint y)
1238a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{
1239a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL)
1240480a11521105a40ffab843d4903473a7de4cddcaChris Craik    WebView* webview = reinterpret_cast<WebView*>(nativeView);
1241480a11521105a40ffab843d4903473a7de4cddcaChris Craik    webview->scrollLayer(layerId, x, y);
124270adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik
124370adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik    //TODO: the below only needed for the SW rendering path
1244480a11521105a40ffab843d4903473a7de4cddcaChris Craik    LayerAndroid* baseLayer = webview->getBaseLayer();
1245885e650b12d781be054b31ae6221925a0184dc33Chris Craik    if (!baseLayer)
12468598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott        return false;
1247885e650b12d781be054b31ae6221925a0184dc33Chris Craik    LayerAndroid* layer = baseLayer->findById(layerId);
1248fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott    if (!layer || !layer->contentIsScrollable())
1249a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        return false;
1250fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott    return static_cast<ScrollableLayerAndroid*>(layer)->scrollTo(x, y);
1251a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#endif
1252a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    return false;
1253a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott}
1254a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott
1255f51a51f6ea307f4311a04aa865a42b233269540bChris Craikstatic void nativeSetIsScrolling(JNIEnv* env, jobject jwebview, jboolean isScrolling)
1256f51a51f6ea307f4311a04aa865a42b233269540bChris Craik{
125772263f1fff55cb108fa98f4b06ae9447d8114757John Reck    // TODO: Pass in the native pointer instead
1258f51a51f6ea307f4311a04aa865a42b233269540bChris Craik    WebView* view = GET_NATIVE_VIEW(env, jwebview);
125972263f1fff55cb108fa98f4b06ae9447d8114757John Reck    if (view)
126072263f1fff55cb108fa98f4b06ae9447d8114757John Reck        view->setIsScrolling(isScrolling);
1261f51a51f6ea307f4311a04aa865a42b233269540bChris Craik}
1262f51a51f6ea307f4311a04aa865a42b233269540bChris Craik
1263c7e578330aece3c556ef205365c24676687223e2Derek Sollenbergerstatic void nativeUseHardwareAccelSkia(JNIEnv*, jobject, jboolean enabled)
1264c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger{
1265c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger    BaseRenderer::setCurrentRendererType(enabled ? BaseRenderer::Ganesh : BaseRenderer::Raster);
1266c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger}
1267c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger
12680c98d349b66fb7649824d019023aa64b4a2e80f7Chris Craikstatic int nativeGetBackgroundColor(JNIEnv* env, jobject obj, jint nativeView)
12695e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck{
12700c98d349b66fb7649824d019023aa64b4a2e80f7Chris Craik    WebView* view = reinterpret_cast<WebView*>(nativeView);
12715e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck    BaseLayerAndroid* baseLayer = view->getBaseLayer();
12725e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck    if (baseLayer) {
12735e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck        WebCore::Color color = baseLayer->getBackgroundColor();
12745e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck        if (color.isValid())
12755e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck            return SkColorSetARGB(color.alpha(), color.red(),
12765e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck                                  color.green(), color.blue());
12775e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck    }
12785e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck    return SK_ColorWHITE;
12795e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck}
12805e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck
1281d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reckstatic void nativeSetPauseDrawing(JNIEnv *env, jobject obj, jint nativeView,
1282d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck                                      jboolean pause)
1283d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck{
128435caaaf726b8b17cec92747a1fe42dba44d6b775John Reck    reinterpret_cast<WebView*>(nativeView)->setDrawingPaused(pause);
1285d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck}
1286d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck
1287dea0c131566f424923425970fe5621305d136e5aJohn Reckstatic void nativeSetTextSelection(JNIEnv *env, jobject obj, jint nativeView,
1288dea0c131566f424923425970fe5621305d136e5aJohn Reck                                   jint selectionPtr)
1289dea0c131566f424923425970fe5621305d136e5aJohn Reck{
1290dea0c131566f424923425970fe5621305d136e5aJohn Reck    SelectText* selection = reinterpret_cast<SelectText*>(selectionPtr);
1291dea0c131566f424923425970fe5621305d136e5aJohn Reck    reinterpret_cast<WebView*>(nativeView)->setTextSelection(selection);
1292dea0c131566f424923425970fe5621305d136e5aJohn Reck}
1293dea0c131566f424923425970fe5621305d136e5aJohn Reck
1294dea0c131566f424923425970fe5621305d136e5aJohn Reckstatic jint nativeGetHandleLayerId(JNIEnv *env, jobject obj, jint nativeView,
1295304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount                                     jint handleIndex, jobject cursorPoint,
1296304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount                                     jobject textQuad)
1297dea0c131566f424923425970fe5621305d136e5aJohn Reck{
1298dea0c131566f424923425970fe5621305d136e5aJohn Reck    WebView* webview = reinterpret_cast<WebView*>(nativeView);
1299304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    SkIPoint nativePoint;
1300304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    FloatQuad nativeTextQuad;
1301304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    int layerId = webview->getHandleLayerId((SelectText::HandleId) handleIndex,
1302304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount            nativePoint, nativeTextQuad);
1303304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    if (cursorPoint)
1304304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount        GraphicsJNI::ipoint_to_jpoint(nativePoint, env, cursorPoint);
1305304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    if (textQuad)
1306304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount        webview->floatQuadToQuadF(env, nativeTextQuad, textQuad);
1307dea0c131566f424923425970fe5621305d136e5aJohn Reck    return layerId;
1308dea0c131566f424923425970fe5621305d136e5aJohn Reck}
1309dea0c131566f424923425970fe5621305d136e5aJohn Reck
1310730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mountstatic void nativeMapLayerRect(JNIEnv *env, jobject obj, jint nativeView,
1311730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount        jint layerId, jobject rect)
1312730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount{
1313730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount    WebView* webview = reinterpret_cast<WebView*>(nativeView);
1314730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount    SkIRect nativeRect;
1315730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount    GraphicsJNI::jrect_to_irect(env, rect, &nativeRect);
1316730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount    webview->mapLayerRect(layerId, nativeRect);
1317730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount    GraphicsJNI::irect_to_jrect(nativeRect, env, rect);
1318730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount}
1319730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount
1320a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reckstatic jint nativeSetHwAccelerated(JNIEnv *env, jobject obj, jint nativeView,
1321a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck        jboolean hwAccelerated)
1322a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck{
1323a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck    WebView* webview = reinterpret_cast<WebView*>(nativeView);
1324a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck    return webview->setHwAccelerated(hwAccelerated);
1325a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck}
1326a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck
1327c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mountstatic void nativeFindMaxVisibleRect(JNIEnv *env, jobject obj, jint nativeView,
1328c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount        jint movingLayerId, jobject visibleContentRect)
1329c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount{
1330c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    WebView* webview = reinterpret_cast<WebView*>(nativeView);
1331c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    SkIRect nativeRect;
1332c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    GraphicsJNI::jrect_to_irect(env, visibleContentRect, &nativeRect);
1333c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    webview->findMaxVisibleRect(movingLayerId, nativeRect);
1334c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    GraphicsJNI::irect_to_jrect(nativeRect, env, visibleContentRect);
1335c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount}
1336c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount
13372d66db6bf0f6f3687361cce7d9280de47ed591eeGeorge Mountstatic bool nativeIsHandleLeft(JNIEnv *env, jobject obj, jint nativeView,
13382d66db6bf0f6f3687361cce7d9280de47ed591eeGeorge Mount        jint handleId)
13392d66db6bf0f6f3687361cce7d9280de47ed591eeGeorge Mount{
13402d66db6bf0f6f3687361cce7d9280de47ed591eeGeorge Mount    WebView* webview = reinterpret_cast<WebView*>(nativeView);
13412d66db6bf0f6f3687361cce7d9280de47ed591eeGeorge Mount    return webview->isHandleLeft(static_cast<SelectText::HandleId>(handleId));
13422d66db6bf0f6f3687361cce7d9280de47ed591eeGeorge Mount}
13432d66db6bf0f6f3687361cce7d9280de47ed591eeGeorge Mount
13446858906040a8e78210021ba85b62c59a193654deGeorge Mountstatic bool nativeIsPointVisible(JNIEnv *env, jobject obj, jint nativeView,
13456858906040a8e78210021ba85b62c59a193654deGeorge Mount        jint layerId, jint contentX, jint contentY)
13466858906040a8e78210021ba85b62c59a193654deGeorge Mount{
13476858906040a8e78210021ba85b62c59a193654deGeorge Mount    WebView* webview = reinterpret_cast<WebView*>(nativeView);
13486858906040a8e78210021ba85b62c59a193654deGeorge Mount    return webview->isPointVisible(layerId, contentX, contentY);
13496858906040a8e78210021ba85b62c59a193654deGeorge Mount}
13506858906040a8e78210021ba85b62c59a193654deGeorge Mount
13518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
13528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * JNI registration
13538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
13548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic JNINativeMethod gJavaWebViewMethods[] = {
135555b4bdbd661ac94fd05ab40de08250bf242d5346John Reck    { "nativeCreate", "(ILjava/lang/String;Z)V",
13568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeCreate },
1357f8f128dcb4ac3fe0ec6d81d1dcd0b15eb2380f6aJohn Reck    { "nativeDestroy", "(I)V",
13588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeDestroy },
1359e859a34171f2a36877d95197d118d962078f8aa0John Reck    { "nativeDraw", "(Landroid/graphics/Canvas;Landroid/graphics/RectF;II)V",
13606d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeDraw },
136124b412c6f16018a2a2971eef09648ce105ef618aChris Craik    { "nativeCreateDrawGLFunction", "(ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/RectF;FI)I",
136224b412c6f16018a2a2971eef09648ce105ef618aChris Craik        (void*) nativeCreateDrawGLFunction },
136324b412c6f16018a2a2971eef09648ce105ef618aChris Craik    { "nativeGetDrawGLFunction", "(I)I",
1364908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        (void*) nativeGetDrawGLFunction },
136524b412c6f16018a2a2971eef09648ce105ef618aChris Craik    { "nativeUpdateDrawGLFunction", "(ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/RectF;F)V",
1366908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        (void*) nativeUpdateDrawGLFunction },
136746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeDumpDisplayTree", "(Ljava/lang/String;)V",
136846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeDumpDisplayTree },
1369223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck    { "nativeEvaluateLayersAnimations", "(I)Z",
137087962ce00229855c098ba12cee8d5c015a835289Cary Clark        (void*) nativeEvaluateLayersAnimations },
13715e5962825729a211e093fd615ddc9e5b0bec10bdCary Clark    { "nativeGetSelection", "()Ljava/lang/String;",
137246dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeGetSelection },
13738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeSetHeightCanMeasure", "(Z)V",
13748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeSetHeightCanMeasure },
13755f4f4a8ff2154f3775ce5988565753b1a0b9c1b6John Reck    { "nativeSetBaseLayer", "(IIZZI)Z",
13766d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeSetBaseLayer },
13770c98d349b66fb7649824d019023aa64b4a2e80f7Chris Craik    { "nativeGetBaseLayer", "(I)I",
13784212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck        (void*) nativeGetBaseLayer },
13796d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    { "nativeCopyBaseContentToPicture", "(Landroid/graphics/Picture;)V",
13806d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeCopyBaseContentToPicture },
1381cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reck    { "nativeDumpLayerContentToPicture", "(ILjava/lang/String;ILandroid/graphics/Picture;)Z",
1382cc6ffa0710f304fbcaa43953b0dc89e1d9b931a2John Reck        (void*) nativeDumpLayerContentToPicture },
13836d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    { "nativeHasContent", "()Z",
13846d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeHasContent },
1385a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik    { "nativeDiscardAllTextures", "()V",
1386a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik        (void*) nativeDiscardAllTextures },
13875dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik    { "nativeTileProfilingStart", "()V",
13885dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik        (void*) nativeTileProfilingStart },
13895dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik    { "nativeTileProfilingStop", "()F",
13905dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik        (void*) nativeTileProfilingStop },
13915dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik    { "nativeTileProfilingClear", "()V",
13925dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik        (void*) nativeTileProfilingClear },
13935dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik    { "nativeTileProfilingNumFrames", "()I",
13945dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik        (void*) nativeTileProfilingNumFrames },
13955dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik    { "nativeTileProfilingNumTilesInFrame", "(I)I",
13965dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik        (void*) nativeTileProfilingNumTilesInFrame },
1397687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    { "nativeTileProfilingGetInt", "(IILjava/lang/String;)I",
1398687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        (void*) nativeTileProfilingGetInt },
1399687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    { "nativeTileProfilingGetFloat", "(IILjava/lang/String;)F",
1400687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        (void*) nativeTileProfilingGetFloat },
1401f8f128dcb4ac3fe0ec6d81d1dcd0b15eb2380f6aJohn Reck    { "nativeStopGL", "(I)V",
14028360bc9c9facd690e42379610cbbb368d3d705efCary Clark        (void*) nativeStopGL },
1403480a11521105a40ffab843d4903473a7de4cddcaChris Craik    { "nativeScrollableLayer", "(IIILandroid/graphics/Rect;Landroid/graphics/Rect;)I",
1404a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        (void*) nativeScrollableLayer },
1405480a11521105a40ffab843d4903473a7de4cddcaChris Craik    { "nativeScrollLayer", "(IIII)Z",
1406a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        (void*) nativeScrollLayer },
1407f51a51f6ea307f4311a04aa865a42b233269540bChris Craik    { "nativeSetIsScrolling", "(Z)V",
1408f51a51f6ea307f4311a04aa865a42b233269540bChris Craik        (void*) nativeSetIsScrolling },
1409c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger    { "nativeUseHardwareAccelSkia", "(Z)V",
1410c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger        (void*) nativeUseHardwareAccelSkia },
14110c98d349b66fb7649824d019023aa64b4a2e80f7Chris Craik    { "nativeGetBackgroundColor", "(I)I",
14125e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck        (void*) nativeGetBackgroundColor },
1413f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard    { "nativeSetProperty", "(Ljava/lang/String;Ljava/lang/String;)Z",
1414d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck        (void*) nativeSetProperty },
1415d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck    { "nativeGetProperty", "(Ljava/lang/String;)Ljava/lang/String;",
1416d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck        (void*) nativeGetProperty },
141752f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck    { "nativeOnTrimMemory", "(I)V",
141852f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck        (void*) nativeOnTrimMemory },
1419d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck    { "nativeSetPauseDrawing", "(IZ)V",
1420d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck        (void*) nativeSetPauseDrawing },
1421dea0c131566f424923425970fe5621305d136e5aJohn Reck    { "nativeSetTextSelection", "(II)V",
1422dea0c131566f424923425970fe5621305d136e5aJohn Reck        (void*) nativeSetTextSelection },
1423304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    { "nativeGetHandleLayerId", "(IILandroid/graphics/Point;Landroid/webkit/QuadF;)I",
1424dea0c131566f424923425970fe5621305d136e5aJohn Reck        (void*) nativeGetHandleLayerId },
1425730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount    { "nativeMapLayerRect", "(IILandroid/graphics/Rect;)V",
1426730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount        (void*) nativeMapLayerRect },
1427a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck    { "nativeSetHwAccelerated", "(IZ)I",
1428a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck        (void*) nativeSetHwAccelerated },
1429c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount    { "nativeFindMaxVisibleRect", "(IILandroid/graphics/Rect;)V",
1430c8d9e14ba1a7c55e17ac2009bda77dc4da834b1cGeorge Mount        (void*) nativeFindMaxVisibleRect },
14312d66db6bf0f6f3687361cce7d9280de47ed591eeGeorge Mount    { "nativeIsHandleLeft", "(II)Z",
14322d66db6bf0f6f3687361cce7d9280de47ed591eeGeorge Mount        (void*) nativeIsHandleLeft },
14336858906040a8e78210021ba85b62c59a193654deGeorge Mount    { "nativeIsPointVisible", "(IIII)Z",
14346858906040a8e78210021ba85b62c59a193654deGeorge Mount        (void*) nativeIsPointVisible },
14358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
14368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1437b92850e0391d674b9c4826b66105aaa3dd3eef96Steve Blockint registerWebView(JNIEnv* env)
14388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
143957ae1393d3097edada2640b40c895396b69cc919Jonathan Dixon    jclass clazz = env->FindClass("android/webkit/WebViewClassic");
144057ae1393d3097edada2640b40c895396b69cc919Jonathan Dixon    ALOG_ASSERT(clazz, "Unable to find class android/webkit/WebViewClassic");
14418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    gWebViewField = env->GetFieldID(clazz, "mNativeClass", "I");
144257ae1393d3097edada2640b40c895396b69cc919Jonathan Dixon    ALOG_ASSERT(gWebViewField, "Unable to find android/webkit/WebViewClassic.mNativeClass");
1443bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(clazz);
14448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
144557ae1393d3097edada2640b40c895396b69cc919Jonathan Dixon    return jniRegisterNativeMethods(env, "android/webkit/WebViewClassic", gJavaWebViewMethods, NELEM(gJavaWebViewMethods));
14468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
14478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace android
1449