WebView.cpp revision d08dc21a96bd91ee23a4419266186cadb4b43681
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"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h"
36594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik#include "GLWebViewState.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsJNI.h"
38dcbb033aafed2abc472f0d88520869a6b1f1945bLeon Scroggins#include "HTMLInputElement.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IntPoint.h"
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IntRect.h"
41797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#include "LayerAndroid.h"
42885e650b12d781be054b31ae6221925a0184dc33Chris Craik#include "LayerContent.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Node.h"
44908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase#include "utils/Functor.h"
45d1f5cf1ad8b20860bd9cb34a483451019124d1f9Romain Guy#include "private/hwui/DrawGlInfo.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformGraphicsContext.h"
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h"
48fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott#include "ScrollableLayerAndroid.h"
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SelectText.h"
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkCanvas.h"
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkDumpCanvas.h"
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkPicture.h"
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkRect.h"
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkTime.h"
55a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "TilesManager.h"
56594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik#include "TransferQueue.h"
5720ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "WebCoreJni.h"
580b84ecf50c01e0fbf7307ca7cae55ab3043c75a3Elliott Slaughter#include "WebRequestContext.h"
5920ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "WebViewCore.h"
6020ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "android_graphics.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;
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    jmethodID   m_getVisibleRect;
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");
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_javaGlue.m_getVisibleRect = GetJMethod(env, clazz, "sendOurVisibleRect", "()Landroid/graphics/Rect;");
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();
234a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    if (left < m_visibleRect.fLeft)
235a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        dx = left - m_visibleRect.fLeft;
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Only scroll right if the entire width can fit on screen.
237a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    else if (right > m_visibleRect.fRight
238a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount            && right - left < m_visibleRect.width())
239a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        dx = right - m_visibleRect.fRight;
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int dy = 0;
241afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark    int top = rect.y();
2421ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block    int bottom = rect.maxY();
243a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    if (top < m_visibleRect.fTop)
244a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        dy = top - m_visibleRect.fTop;
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Only scroll down if the entire height can fit on screen
246a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    else if (bottom > m_visibleRect.fBottom
247a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount            && bottom - top < m_visibleRect.height())
248a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        dy = bottom - m_visibleRect.fBottom;
24951c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins    if ((dx|dy) == 0 || !scrollBy(dx, dy))
250afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark        return;
25151c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins    viewInvalidate();
252e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins}
253e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins
254bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhuint drawGL(WebCore::IntRect& viewRect, WebCore::IntRect* invalRect,
255a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        WebCore::IntRect& webViewRect, int titleBarHeight,
256bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu        WebCore::IntRect& clip, 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
262e47399f767707497dfc68fc64b14621a8ca9959fTeng-Hui Zhu    if (!m_glWebViewState) {
263e1dfe84b38ed080c7bb7ac00fd9e3c6c590a147dTeng-Hui Zhu        TilesManager::instance()->setHighEndGfx(m_isHighEndGfx);
26482ccbd8ce95211b4b5afad6a653462fd3beb771bJohn Reck        m_glWebViewState = new GLWebViewState();
265885e650b12d781be054b31ae6221925a0184dc33Chris Craik        m_glWebViewState->setBaseLayer(m_baseLayer, false, true);
266e47399f767707497dfc68fc64b14621a8ca9959fTeng-Hui Zhu    }
267c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger
26839b886463564843ebfd0557dd12b07bf38cb6d83John Reck    DrawExtra* extra = getDrawExtra((DrawExtras) extras);
269a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
270fcb01cd64de0a1d6f8f8c897d16cc2628be53960John Reck    m_glWebViewState->glExtras()->setDrawExtra(extra);
2710ca8045217bb9b308ddb407d7a9ce17d92d9f9fbNicolas Roard
272d68563709fdf68c90c730155149f6149b084730aJohn Reck    // Make sure we have valid coordinates. We might not have valid coords
273d68563709fdf68c90c730155149f6149b084730aJohn Reck    // if the zoom manager is still initializing. We will be redrawn
274d68563709fdf68c90c730155149f6149b084730aJohn Reck    // once the correct scale is set
2752857538e8cd8c752b06ee75dd039791a186455b3Derek Sollenberger    if (!m_visibleRect.isFinite())
276bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu        return 0;
277aeca53d3fee2e94ce013c1dc12648f0335284fbbChris Craik    bool treesSwapped = false;
278aeca53d3fee2e94ce013c1dc12648f0335284fbbChris Craik    bool newTreeHasAnim = false;
279bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu    int ret = m_glWebViewState->drawGL(viewRect, m_visibleRect, invalRect,
28096eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik                                        webViewRect, titleBarHeight, clip, scale,
281bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu                                        &treesSwapped, &newTreeHasAnim, shouldDraw);
282246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik    if (treesSwapped) {
2836dd76b804786ec760bb04b137a6bf017064226dcSteve Block        ALOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
28496eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik        JNIEnv* env = JSC::Bindings::getJNIEnv();
28596eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik        AutoJObject javaObject = m_javaGlue.object(env);
28696eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik        if (javaObject.get()) {
287aeca53d3fee2e94ce013c1dc12648f0335284fbbChris Craik            env->CallVoidMethod(javaObject.get(), m_javaGlue.m_pageSwapCallback, newTreeHasAnim);
28896eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik            checkException(env);
28996eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik        }
29096eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik    }
291bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu    return m_isDrawingPaused ? 0 : ret;
292a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
293bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu    return 0;
294a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
295a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
296dea0c131566f424923425970fe5621305d136e5aJohn ReckPictureSet* draw(SkCanvas* canvas, SkColor bgColor, DrawExtras extras, bool split)
29787962ce00229855c098ba12cee8d5c015a835289Cary Clark{
2986d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    PictureSet* ret = 0;
2996d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (!m_baseLayer) {
3006d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        canvas->drawColor(bgColor);
3016d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return ret;
3026d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    }
3036d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
3046d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    // draw the content of the base layer first
305b3f4d3af0b06dc168453641e249d0cb9eec9b570Nicolas Roard    LayerContent* content = m_baseLayer->content();
3066d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    int sc = canvas->save(SkCanvas::kClip_SaveFlag);
3076d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    canvas->clipRect(SkRect::MakeLTRB(0, 0, content->width(),
3086d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba                content->height()), SkRegion::kDifference_Op);
3096d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    canvas->drawColor(bgColor);
3106d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    canvas->restoreToCount(sc);
3116d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
312885e650b12d781be054b31ae6221925a0184dc33Chris Craik    // call this to be sure we've adjusted for any scrolling or animations
313885e650b12d781be054b31ae6221925a0184dc33Chris Craik    // before we actually draw
314885e650b12d781be054b31ae6221925a0184dc33Chris Craik    m_baseLayer->updateLayerPositions(m_visibleRect);
315885e650b12d781be054b31ae6221925a0184dc33Chris Craik    m_baseLayer->updatePositions();
316885e650b12d781be054b31ae6221925a0184dc33Chris Craik
317885e650b12d781be054b31ae6221925a0184dc33Chris Craik    // We have to set the canvas' matrix on the base layer
318885e650b12d781be054b31ae6221925a0184dc33Chris Craik    // (to have fixed layers work as intended)
319885e650b12d781be054b31ae6221925a0184dc33Chris Craik    SkAutoCanvasRestore restore(canvas, true);
320885e650b12d781be054b31ae6221925a0184dc33Chris Craik    m_baseLayer->setMatrix(canvas->getTotalMatrix());
321885e650b12d781be054b31ae6221925a0184dc33Chris Craik    canvas->resetMatrix();
322885e650b12d781be054b31ae6221925a0184dc33Chris Craik    m_baseLayer->draw(canvas, getDrawExtra(extras));
323dea0c131566f424923425970fe5621305d136e5aJohn Reck
3246d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    return ret;
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint getScaledMaxXScroll()
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3296dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
331b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
332b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
333b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return 0;
334b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    int result = env->CallIntMethod(javaObject.get(), m_javaGlue.m_getScaledMaxXScroll);
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint getScaledMaxYScroll()
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3416dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
343b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
344b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
345b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return 0;
346b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    int result = env->CallIntMethod(javaObject.get(), m_javaGlue.m_getScaledMaxYScroll);
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
351af03a3d6830584ef606be2d1c64845815dadb146Cary ClarkIntRect getVisibleRect()
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
353af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    IntRect rect;
3546dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
356b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
357b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
358b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return rect;
359b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    jobject jRect = env->CallObjectMethod(javaObject.get(), m_javaGlue.m_getVisibleRect);
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
361af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    rect.setX(env->GetIntField(jRect, m_javaGlue.m_rectLeft));
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
363af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    rect.setY(env->GetIntField(jRect, m_javaGlue.m_rectTop));
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
365af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    rect.setWidth(env->CallIntMethod(jRect, m_javaGlue.m_rectWidth));
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
367af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    rect.setHeight(env->CallIntMethod(jRect, m_javaGlue.m_rectHeight));
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    env->DeleteLocalRef(jRect);
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
371af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    return rect;
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37482f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if USE(ACCELERATED_COMPOSITING)
375f81c672a4f5c06621000a6df0984cde689397d94Cary Clarkstatic const ScrollableLayerAndroid* findScrollableLayer(
376f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    const LayerAndroid* parent, int x, int y, SkIRect* foundBounds) {
37782f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    SkRect bounds;
37882f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    parent->bounds(&bounds);
37982f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    // Check the parent bounds first; this will clip to within a masking layer's
38082f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    // bounds.
381fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott    if (parent->masksToBounds() && !bounds.contains(x, y))
38282f247bdbb98dd80c44209d87692c650c3704617Patrick Scott        return 0;
38382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    // Move the hit test local to parent.
38482f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    x -= bounds.fLeft;
38582f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    y -= bounds.fTop;
38682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    int count = parent->countChildren();
3871a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott    while (count--) {
3881a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott        const LayerAndroid* child = parent->getChild(count);
389f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        const ScrollableLayerAndroid* result = findScrollableLayer(child, x, y,
390f81c672a4f5c06621000a6df0984cde689397d94Cary Clark            foundBounds);
391f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        if (result) {
392f81c672a4f5c06621000a6df0984cde689397d94Cary Clark            foundBounds->offset(bounds.fLeft, bounds.fTop);
393f81c672a4f5c06621000a6df0984cde689397d94Cary Clark            if (parent->masksToBounds()) {
394f81c672a4f5c06621000a6df0984cde689397d94Cary Clark                if (bounds.width() < foundBounds->width())
395f81c672a4f5c06621000a6df0984cde689397d94Cary Clark                    foundBounds->fRight = foundBounds->fLeft + bounds.width();
396f81c672a4f5c06621000a6df0984cde689397d94Cary Clark                if (bounds.height() < foundBounds->height())
397f81c672a4f5c06621000a6df0984cde689397d94Cary Clark                    foundBounds->fBottom = foundBounds->fTop + bounds.height();
398f81c672a4f5c06621000a6df0984cde689397d94Cary Clark            }
39982f247bdbb98dd80c44209d87692c650c3704617Patrick Scott            return result;
400f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        }
40182f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    }
402f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    if (parent->contentIsScrollable()) {
403f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        foundBounds->set(0, 0, bounds.width(), bounds.height());
404fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott        return static_cast<const ScrollableLayerAndroid*>(parent);
405f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    }
40682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    return 0;
40782f247bdbb98dd80c44209d87692c650c3704617Patrick Scott}
40882f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif
40982f247bdbb98dd80c44209d87692c650c3704617Patrick Scott
410f81c672a4f5c06621000a6df0984cde689397d94Cary Clarkint scrollableLayer(int x, int y, SkIRect* layerRect, SkIRect* bounds)
411a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{
41282f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if USE(ACCELERATED_COMPOSITING)
413885e650b12d781be054b31ae6221925a0184dc33Chris Craik    if (!m_baseLayer)
414a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        return 0;
415885e650b12d781be054b31ae6221925a0184dc33Chris Craik    const ScrollableLayerAndroid* result = findScrollableLayer(m_baseLayer, x, y, bounds);
41622e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott    if (result) {
41722e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott        result->getScrollRect(layerRect);
4188598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott        return result->uniqueId();
41922e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott    }
420a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#endif
421a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    return 0;
422a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott}
423a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott
42470adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craikvoid scrollLayer(int layerId, int x, int y)
42570adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik{
42670adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik    if (m_glWebViewState)
42770adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik        m_glWebViewState->scrollLayer(layerId, x, y);
42870adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik}
42970adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid setHeightCanMeasure(bool measure)
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_heightCanMeasure = measure;
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43587962ce00229855c098ba12cee8d5c015a835289Cary ClarkString getSelection()
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
437dea0c131566f424923425970fe5621305d136e5aJohn Reck    SelectText* select = static_cast<SelectText*>(
438dea0c131566f424923425970fe5621305d136e5aJohn Reck            getDrawExtra(WebView::DrawExtrasSelection));
439dea0c131566f424923425970fe5621305d136e5aJohn Reck    if (select)
440dea0c131566f424923425970fe5621305d136e5aJohn Reck        return select->getText();
441dea0c131566f424923425970fe5621305d136e5aJohn Reck    return String();
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44451c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scrogginsbool scrollBy(int dx, int dy)
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4466dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
449b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
450b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
451b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return false;
452b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    bool result = env->CallBooleanMethod(javaObject.get(), m_javaGlue.m_scrollBy, dx, dy, true);
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
45451c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins    return result;
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
457f51a51f6ea307f4311a04aa865a42b233269540bChris Craikvoid setIsScrolling(bool isScrolling)
458f51a51f6ea307f4311a04aa865a42b233269540bChris Craik{
459ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch#if USE(ACCELERATED_COMPOSITING)
460ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch    if (m_glWebViewState)
461ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch        m_glWebViewState->setIsScrolling(isScrolling);
462ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch#endif
463f51a51f6ea307f4311a04aa865a42b233269540bChris Craik}
464f51a51f6ea307f4311a04aa865a42b233269540bChris Craik
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid viewInvalidate()
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
468b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
469b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
470b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
471b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_viewInvalidate);
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid viewInvalidateRect(int l, int t, int r, int b)
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
478b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
479b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
480b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
481b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_viewInvalidateRect, l, r, t, b);
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid postInvalidateDelayed(int64_t delay, const WebCore::IntRect& bounds)
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
488b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
489b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
490b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
491b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_postInvalidateDelayed,
4921ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block        delay, bounds.x(), bounds.y(), bounds.maxX(), bounds.maxY());
4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL)
497a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scottstatic void copyScrollPositionRecursive(const LayerAndroid* from,
498a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott                                        LayerAndroid* root)
499a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{
500a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    if (!from || !root)
501a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        return;
502a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    for (int i = 0; i < from->countChildren(); i++) {
503a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        const LayerAndroid* l = from->getChild(i);
504a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        if (l->contentIsScrollable()) {
50582f247bdbb98dd80c44209d87692c650c3704617Patrick Scott            const SkPoint& pos = l->getPosition();
50682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott            LayerAndroid* match = root->findById(l->uniqueId());
50782f247bdbb98dd80c44209d87692c650c3704617Patrick Scott            if (match && match->contentIsScrollable())
50882f247bdbb98dd80c44209d87692c650c3704617Patrick Scott                match->setPosition(pos.fX, pos.fY);
509a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        }
510a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        copyScrollPositionRecursive(l, root);
511a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    }
512a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott}
51382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif
514a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott
515885e650b12d781be054b31ae6221925a0184dc33Chris CraikBaseLayerAndroid* getBaseLayer() const { return m_baseLayer; }
516885e650b12d781be054b31ae6221925a0184dc33Chris Craik
517885e650b12d781be054b31ae6221925a0184dc33Chris Craikbool setBaseLayer(BaseLayerAndroid* newBaseLayer, SkRegion& inval, bool showVisualIndicator,
518246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik                  bool isPictureAfterFirstLayout)
519f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{
520246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik    bool queueFull = false;
521a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
522246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik    if (m_glWebViewState) {
523885e650b12d781be054b31ae6221925a0184dc33Chris Craik        // TODO: mark as inval on webkit side
524885e650b12d781be054b31ae6221925a0184dc33Chris Craik        if (newBaseLayer)
525885e650b12d781be054b31ae6221925a0184dc33Chris Craik            newBaseLayer->markAsDirty(inval);
526885e650b12d781be054b31ae6221925a0184dc33Chris Craik        queueFull = m_glWebViewState->setBaseLayer(newBaseLayer, showVisualIndicator,
527246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik                                                   isPictureAfterFirstLayout);
528246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik    }
529a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
530a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
53182f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL)
532885e650b12d781be054b31ae6221925a0184dc33Chris Craik    if (newBaseLayer) {
533885e650b12d781be054b31ae6221925a0184dc33Chris Craik        // TODO: the below tree position copies are only necessary in software rendering
534885e650b12d781be054b31ae6221925a0184dc33Chris Craik        copyScrollPositionRecursive(m_baseLayer, newBaseLayer);
535cf6e10e145f44cab3eb70f3782b51a92cf61ae7dShimeng (Simon) Wang    }
53682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif
537b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger    SkSafeUnref(m_baseLayer);
538885e650b12d781be054b31ae6221925a0184dc33Chris Craik    m_baseLayer = newBaseLayer;
539246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik
540246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik    return queueFull;
5416d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
5426d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
5436d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobavoid replaceBaseContent(PictureSet* set)
5446d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
5456d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (!m_baseLayer)
5466d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return;
547b3f4d3af0b06dc168453641e249d0cb9eec9b570Nicolas Roard    // TODO: remove the split picture codepath
5486d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    delete set;
5496d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
5506d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
5516d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobavoid copyBaseContentToPicture(SkPicture* picture)
5526d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
5536d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (!m_baseLayer)
5546d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return;
555b3f4d3af0b06dc168453641e249d0cb9eec9b570Nicolas Roard    LayerContent* content = m_baseLayer->content();
556885e650b12d781be054b31ae6221925a0184dc33Chris Craik    content->draw(picture->beginRecording(content->width(), content->height(),
557885e650b12d781be054b31ae6221925a0184dc33Chris Craik                                          SkPicture::kUsePathBoundsForClip_RecordingFlag));
5586d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    picture->endRecording();
5596d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
5606d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
5616d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobabool hasContent() {
5626d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (!m_baseLayer)
5636d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return false;
5646d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    return !m_baseLayer->content()->isEmpty();
565f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark}
566f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark
567908703e420f4931f74527aaeb3d5faabdd66c28aChet Haasevoid setFunctor(Functor* functor) {
568908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    delete m_glDrawFunctor;
569908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    m_glDrawFunctor = functor;
570908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}
571908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
572908703e420f4931f74527aaeb3d5faabdd66c28aChet HaaseFunctor* getFunctor() {
573908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    return m_glDrawFunctor;
574908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}
575908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
576a5e649bc4d58bf3da959deae077307c487e2a3a6George Mountvoid setVisibleRect(SkRect& visibleRect) {
577a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    m_visibleRect = visibleRect;
578a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount}
579a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount
580dea0c131566f424923425970fe5621305d136e5aJohn Reckvoid setDrawExtra(DrawExtra *extra, DrawExtras type)
581dea0c131566f424923425970fe5621305d136e5aJohn Reck{
582dea0c131566f424923425970fe5621305d136e5aJohn Reck    if (type == DrawExtrasNone)
583dea0c131566f424923425970fe5621305d136e5aJohn Reck        return;
584dea0c131566f424923425970fe5621305d136e5aJohn Reck    DrawExtra* old = m_extras[type - 1];
585dea0c131566f424923425970fe5621305d136e5aJohn Reck    m_extras[type - 1] = extra;
586dea0c131566f424923425970fe5621305d136e5aJohn Reck    if (old != extra) {
587dea0c131566f424923425970fe5621305d136e5aJohn Reck        delete old;
588dea0c131566f424923425970fe5621305d136e5aJohn Reck    }
589dea0c131566f424923425970fe5621305d136e5aJohn Reck}
590dea0c131566f424923425970fe5621305d136e5aJohn Reck
591dea0c131566f424923425970fe5621305d136e5aJohn Reckvoid setTextSelection(SelectText *selection) {
592dea0c131566f424923425970fe5621305d136e5aJohn Reck    setDrawExtra(selection, DrawExtrasSelection);
593dea0c131566f424923425970fe5621305d136e5aJohn Reck}
594dea0c131566f424923425970fe5621305d136e5aJohn Reck
595304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mountint getHandleLayerId(SelectText::HandleId handleId, SkIPoint& cursorPoint,
596304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount        FloatQuad& textBounds) {
597dea0c131566f424923425970fe5621305d136e5aJohn Reck    SelectText* selectText = static_cast<SelectText*>(getDrawExtra(DrawExtrasSelection));
598fba5bad67c2589216f05da70a7f2fbd537637672John Reck    if (!selectText || !m_baseLayer)
599dea0c131566f424923425970fe5621305d136e5aJohn Reck        return -1;
600dea0c131566f424923425970fe5621305d136e5aJohn Reck    int layerId = selectText->caretLayerId(handleId);
601304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    IntRect cursorRect = selectText->caretRect(handleId);
602304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    IntRect textRect = selectText->textRect(handleId);
603304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    // Rects exclude the last pixel on right/bottom. We want only included pixels.
604304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    cursorPoint.set(cursorRect.x(), cursorRect.maxY() - 1);
605304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    textRect.setHeight(textRect.height() - 1);
606304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    textRect.setWidth(textRect.width() - 1);
607304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    textBounds = FloatQuad(textRect);
608304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount
609e5d643b22badb45c77ef040896bd8ac46edae7d0George Mount    if (layerId != -1) {
610e5d643b22badb45c77ef040896bd8ac46edae7d0George Mount        // We need to make sure the drawTransform is up to date as this is
611e5d643b22badb45c77ef040896bd8ac46edae7d0George Mount        // called before a draw() or drawGL()
612e5d643b22badb45c77ef040896bd8ac46edae7d0George Mount        m_baseLayer->updateLayerPositions(m_visibleRect);
613885e650b12d781be054b31ae6221925a0184dc33Chris Craik        LayerAndroid* root = m_baseLayer;
614e5d643b22badb45c77ef040896bd8ac46edae7d0George Mount        LayerAndroid* layer = root ? root->findById(layerId) : 0;
615e5d643b22badb45c77ef040896bd8ac46edae7d0George Mount        if (layer && layer->drawTransform()) {
616e5d643b22badb45c77ef040896bd8ac46edae7d0George Mount            const TransformationMatrix* transform = layer->drawTransform();
617e5d643b22badb45c77ef040896bd8ac46edae7d0George Mount            // We're overloading the concept of Rect to be just the two
618e5d643b22badb45c77ef040896bd8ac46edae7d0George Mount            // points (bottom-left and top-right.
619304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount            cursorPoint = transform->mapPoint(cursorPoint);
620304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount            textBounds = transform->mapQuad(textBounds);
621e5d643b22badb45c77ef040896bd8ac46edae7d0George Mount        }
622e5d643b22badb45c77ef040896bd8ac46edae7d0George Mount    }
623730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount    return layerId;
624730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount}
625730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount
626730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mountvoid mapLayerRect(int layerId, SkIRect& rect) {
627dea0c131566f424923425970fe5621305d136e5aJohn Reck    if (layerId != -1) {
628df71abcaa1e7975b2fbc7522d006829223093825John Reck        // We need to make sure the drawTransform is up to date as this is
629df71abcaa1e7975b2fbc7522d006829223093825John Reck        // called before a draw() or drawGL()
630df71abcaa1e7975b2fbc7522d006829223093825John Reck        m_baseLayer->updateLayerPositions(m_visibleRect);
631885e650b12d781be054b31ae6221925a0184dc33Chris Craik        LayerAndroid* layer = m_baseLayer ? m_baseLayer->findById(layerId) : 0;
632ca8907cd631723128e1c3a8718e8d059998cb143John Reck        if (layer && layer->drawTransform())
633ca8907cd631723128e1c3a8718e8d059998cb143John Reck            rect = layer->drawTransform()->mapRect(rect);
634dea0c131566f424923425970fe5621305d136e5aJohn Reck    }
635dea0c131566f424923425970fe5621305d136e5aJohn Reck}
636dea0c131566f424923425970fe5621305d136e5aJohn Reck
637304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mountvoid floatQuadToQuadF(JNIEnv* env, const FloatQuad& nativeTextQuad,
638304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount        jobject textQuad)
639304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount{
640304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    jobject p1 = env->GetObjectField(textQuad, m_javaGlue.m_quadFP1);
641304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    jobject p2 = env->GetObjectField(textQuad, m_javaGlue.m_quadFP2);
642304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    jobject p3 = env->GetObjectField(textQuad, m_javaGlue.m_quadFP3);
643304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    jobject p4 = env->GetObjectField(textQuad, m_javaGlue.m_quadFP4);
644304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    GraphicsJNI::point_to_jpointf(nativeTextQuad.p1(), env, p1);
645304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    GraphicsJNI::point_to_jpointf(nativeTextQuad.p2(), env, p2);
646304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    GraphicsJNI::point_to_jpointf(nativeTextQuad.p3(), env, p3);
647304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    GraphicsJNI::point_to_jpointf(nativeTextQuad.p4(), env, p4);
648304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    env->DeleteLocalRef(p1);
649304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    env->DeleteLocalRef(p2);
650304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    env->DeleteLocalRef(p3);
651304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    env->DeleteLocalRef(p4);
652304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount}
653304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount
654a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck// This is called when WebView switches rendering modes in a more permanent fashion
655a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck// such as when the layer type is set or the view is attached/detached from the window
656a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reckint setHwAccelerated(bool hwAccelerated) {
657a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck    if (!m_glWebViewState)
658a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck        return 0;
659885e650b12d781be054b31ae6221925a0184dc33Chris Craik    LayerAndroid* root = m_baseLayer;
660a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck    if (root)
661a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck        return root->setHwAccelerated(hwAccelerated);
662a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck    return 0;
663a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck}
664a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck
665d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck    bool m_isDrawingPaused;
6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate: // local state for WebView
6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // private to getFrameCache(); other functions operate in a different thread
6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebViewCore* m_viewImpl;
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int m_generation; // associate unique ID with sent kit focus to match with ui
6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Corresponds to the same-named boolean on the java side.
6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_heightCanMeasure;
6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int m_lastDx;
6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkMSec m_lastDxTime;
674dea0c131566f424923425970fe5621305d136e5aJohn Reck    DrawExtra* m_extras[DRAW_EXTRAS_SIZE];
6756d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    BaseLayerAndroid* m_baseLayer;
676908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    Functor* m_glDrawFunctor;
677a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
678c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    GLWebViewState* m_glWebViewState;
679a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
680a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    SkRect m_visibleRect;
68155b4bdbd661ac94fd05ab40de08250bf242d5346John Reck    bool m_isHighEndGfx;
6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; // end of WebView class
6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
684908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
685908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase/**
686908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * This class holds a function pointer and parameters for calling drawGL into a specific
687908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * viewport. The pointer to the Functor will be put on a framework display list to be called
688908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * when the display list is replayed.
689908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase */
690908703e420f4931f74527aaeb3d5faabdd66c28aChet Haaseclass GLDrawFunctor : Functor {
691908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    public:
692908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    GLDrawFunctor(WebView* _wvInstance,
693bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu            int (WebView::*_funcPtr)(WebCore::IntRect&, WebCore::IntRect*,
694bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu                    WebCore::IntRect&, int, WebCore::IntRect&, jfloat, jint, bool),
695908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase            WebCore::IntRect _viewRect, float _scale, int _extras) {
696908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        wvInstance = _wvInstance;
697908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        funcPtr = _funcPtr;
698908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        viewRect = _viewRect;
699908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        scale = _scale;
700908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        extras = _extras;
701908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    };
70279d8e0434bfe00a793e8041f96dc02ec1d98e694Romain Guy    status_t operator()(int messageId, void* data) {
70379d8e0434bfe00a793e8041f96dc02ec1d98e694Romain Guy        if (viewRect.isEmpty()) {
704821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase            // NOOP operation if viewport is empty
705821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase            return 0;
706821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase        }
70779d8e0434bfe00a793e8041f96dc02ec1d98e694Romain Guy
7089f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard        WebCore::IntRect inval;
7099f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard        int titlebarHeight = webViewRect.height() - viewRect.height();
710b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner
711b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner        uirenderer::DrawGlInfo* info = reinterpret_cast<uirenderer::DrawGlInfo*>(data);
712be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard        WebCore::IntRect clip(info->clipLeft, info->clipTop,
713be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard                              info->clipRight - info->clipLeft,
714be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard                              info->clipBottom - info->clipTop);
715d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu
716d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu        WebCore::IntRect localViewRect = viewRect;
717d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu        if (info->isLayer) {
718d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu            // When webview is on a layer, we need to use the viewport relative
719d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu            // to the FBO, rather than the screen(which will use viewRect).
720d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu            localViewRect.setX(clip.x());
721d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu            localViewRect.setY(info->height - clip.y() - clip.height());
722d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu        }
723bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu        bool shouldDraw = (messageId == uirenderer::DrawGlInfo::kModeDraw);
724e7770b07e6dd4b0edff8725bc0f7a505417dd4f1Teng-Hui Zhu        TilesManager::instance()->shader()->setWebViewMatrix(info->transform, info->isLayer);
725bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu        int returnFlags = (*wvInstance.*funcPtr)(localViewRect, &inval, webViewRect,
726bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu                titlebarHeight, clip, scale, extras, shouldDraw);
727bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu        if ((returnFlags & uirenderer::DrawGlInfo::kStatusDraw) != 0) {
7289f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard            IntRect finalInval;
729bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu            if (inval.isEmpty())
7309f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard                finalInval = webViewRect;
731bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu            else {
7329f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard                finalInval.setX(webViewRect.x() + inval.x());
733be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard                finalInval.setY(webViewRect.y() + titlebarHeight + inval.y());
7349f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard                finalInval.setWidth(inval.width());
7359f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard                finalInval.setHeight(inval.height());
7369f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard            }
737d1f5cf1ad8b20860bd9cb34a483451019124d1f9Romain Guy            info->dirtyLeft = finalInval.x();
738d1f5cf1ad8b20860bd9cb34a483451019124d1f9Romain Guy            info->dirtyTop = finalInval.y();
7391ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block            info->dirtyRight = finalInval.maxX();
7401ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block            info->dirtyBottom = finalInval.maxY();
741b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy        }
742bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu        // return 1 if invalidation needed, 2 to request non-drawing functor callback, 0 otherwise
743bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu        ALOGV("returnFlags are %d, shouldDraw %d", returnFlags, shouldDraw);
744bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu        return returnFlags;
745908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    }
746908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    void updateRect(WebCore::IntRect& _viewRect) {
747908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        viewRect = _viewRect;
748908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    }
749b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy    void updateViewRect(WebCore::IntRect& _viewRect) {
750b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy        webViewRect = _viewRect;
751b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy    }
752d0a011b30b97598ee74f329aaa217a6ab733f1f1Teng-Hui Zhu    void updateScale(float _scale) {
753d0a011b30b97598ee74f329aaa217a6ab733f1f1Teng-Hui Zhu        scale = _scale;
754d0a011b30b97598ee74f329aaa217a6ab733f1f1Teng-Hui Zhu    }
755908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    private:
756908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    WebView* wvInstance;
757bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu    int (WebView::*funcPtr)(WebCore::IntRect&, WebCore::IntRect*,
758bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu            WebCore::IntRect&, int, WebCore::IntRect&, float, int, bool);
759908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    WebCore::IntRect viewRect;
760b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy    WebCore::IntRect webViewRect;
761908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    jfloat scale;
762908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    jint extras;
763908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase};
764908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Native JNI methods
7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
76955b4bdbd661ac94fd05ab40de08250bf242d5346John Reckstatic void nativeCreate(JNIEnv *env, jobject obj, int viewImpl,
77055b4bdbd661ac94fd05ab40de08250bf242d5346John Reck                         jstring drawableDir, jboolean isHighEndGfx)
7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7724de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins    WTF::String dir = jstringToWtfString(env, drawableDir);
773894aaa1bd5446eebf8169efa1998fbe6964c18d0Chris Craik    new WebView(env, obj, viewImpl, dir, isHighEndGfx);
7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // NEED THIS OR SOMETHING LIKE IT!
7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //Release(obj);
7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
77846dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic WebCore::IntRect jrect_to_webrect(JNIEnv* env, jobject obj)
77946dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
780a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    if (obj) {
781a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        int L, T, R, B;
782a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        GraphicsJNI::get_jrect(env, obj, &L, &T, &R, &B);
783a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        return WebCore::IntRect(L, T, R - L, B - T);
784a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    } else
785a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        return WebCore::IntRect();
786a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount}
787a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount
788a5e649bc4d58bf3da959deae077307c487e2a3a6George Mountstatic SkRect jrectf_to_rect(JNIEnv* env, jobject obj)
789a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount{
790a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    SkRect rect = SkRect::MakeEmpty();
791a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    if (obj)
792a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        GraphicsJNI::jrectf_to_rect(env, obj, &rect);
793a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    return rect;
79446dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
79546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
796a5e649bc4d58bf3da959deae077307c487e2a3a6George Mountstatic jint nativeDraw(JNIEnv *env, jobject obj, jobject canv,
797a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        jobject visible, jint color,
7986d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        jint extras, jboolean split) {
7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkCanvas* canvas = GraphicsJNI::getNativeCanvas(env, canv);
800a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    WebView* webView = GET_NATIVE_VIEW(env, obj);
801a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    SkRect visibleRect = jrectf_to_rect(env, visible);
802a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    webView->setVisibleRect(visibleRect);
803dea0c131566f424923425970fe5621305d136e5aJohn Reck    PictureSet* pictureSet = webView->draw(canvas, color,
804dea0c131566f424923425970fe5621305d136e5aJohn Reck            static_cast<WebView::DrawExtras>(extras), split);
805a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    return reinterpret_cast<jint>(pictureSet);
8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
808223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reckstatic jint nativeGetDrawGLFunction(JNIEnv *env, jobject obj, jint nativeView,
809223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck                                    jobject jrect, jobject jviewrect,
810a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount                                    jobject jvisiblerect,
811223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck                                    jfloat scale, jint extras) {
812a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    WebCore::IntRect viewRect = jrect_to_webrect(env, jrect);
813223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck    WebView *wvInstance = (WebView*) nativeView;
814a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    SkRect visibleRect = jrectf_to_rect(env, jvisiblerect);
815a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    wvInstance->setVisibleRect(visibleRect);
816a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount
817a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    GLDrawFunctor* functor = new GLDrawFunctor(wvInstance,
818a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount            &android::WebView::drawGL, viewRect, scale, extras);
819908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    wvInstance->setFunctor((Functor*) functor);
820b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy
821a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    WebCore::IntRect webViewRect = jrect_to_webrect(env, jviewrect);
822b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy    functor->updateViewRect(webViewRect);
823b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy
824908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    return (jint)functor;
825908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}
826908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
827a5e649bc4d58bf3da959deae077307c487e2a3a6George Mountstatic void nativeUpdateDrawGLFunction(JNIEnv *env, jobject obj, jobject jrect,
828d0a011b30b97598ee74f329aaa217a6ab733f1f1Teng-Hui Zhu        jobject jviewrect, jobject jvisiblerect, jfloat scale) {
829908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    WebView *wvInstance = GET_NATIVE_VIEW(env, obj);
830a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    if (wvInstance) {
831908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        GLDrawFunctor* functor = (GLDrawFunctor*) wvInstance->getFunctor();
832a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        if (functor) {
833a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount            WebCore::IntRect viewRect = jrect_to_webrect(env, jrect);
834908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase            functor->updateRect(viewRect);
835b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy
836a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount            SkRect visibleRect = jrectf_to_rect(env, jvisiblerect);
837a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount            wvInstance->setVisibleRect(visibleRect);
838a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount
839a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount            WebCore::IntRect webViewRect = jrect_to_webrect(env, jviewrect);
840b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy            functor->updateViewRect(webViewRect);
841d0a011b30b97598ee74f329aaa217a6ab733f1f1Teng-Hui Zhu
842d0a011b30b97598ee74f329aaa217a6ab733f1f1Teng-Hui Zhu            functor->updateScale(scale);
843908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        }
844908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    }
845908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}
846908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
847223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reckstatic bool nativeEvaluateLayersAnimations(JNIEnv *env, jobject obj, jint nativeView)
848797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{
849c6151a04881a67d08d91237891fbc7cb82927219John Reck    // only call in software rendering, initialize and evaluate animations
850797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#if USE(ACCELERATED_COMPOSITING)
851885e650b12d781be054b31ae6221925a0184dc33Chris Craik    BaseLayerAndroid* baseLayer = ((WebView*)nativeView)->getBaseLayer();
852885e650b12d781be054b31ae6221925a0184dc33Chris Craik    if (baseLayer) {
853885e650b12d781be054b31ae6221925a0184dc33Chris Craik        baseLayer->initAnimations();
854885e650b12d781be054b31ae6221925a0184dc33Chris Craik        return baseLayer->evaluateAnimations();
855c6151a04881a67d08d91237891fbc7cb82927219John Reck    }
856797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#endif
857797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard    return false;
858797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard}
859797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard
860246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craikstatic bool nativeSetBaseLayer(JNIEnv *env, jobject obj, jint nativeView, jint layer, jobject inval,
861246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik                               jboolean showVisualIndicator,
862246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik                               jboolean isPictureAfterFirstLayout)
863f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{
8646d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    BaseLayerAndroid* layerImpl = reinterpret_cast<BaseLayerAndroid*>(layer);
86567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    SkRegion invalRegion;
86667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    if (inval)
86767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard        invalRegion = *GraphicsJNI::getNativeRegion(env, inval);
868246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik    return ((WebView*)nativeView)->setBaseLayer(layerImpl, invalRegion, showVisualIndicator,
869246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik                                                isPictureAfterFirstLayout);
8706d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
8716d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
8724212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reckstatic BaseLayerAndroid* nativeGetBaseLayer(JNIEnv *env, jobject obj)
8734212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck{
8744212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck    return GET_NATIVE_VIEW(env, obj)->getBaseLayer();
8754212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck}
8764212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck
8776d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic void nativeReplaceBaseContent(JNIEnv *env, jobject obj, jint content)
8786d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
8796d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    PictureSet* set = reinterpret_cast<PictureSet*>(content);
8806d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    GET_NATIVE_VIEW(env, obj)->replaceBaseContent(set);
8816d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
8826d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
8836d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic void nativeCopyBaseContentToPicture(JNIEnv *env, jobject obj, jobject pict)
8846d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
8856d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    SkPicture* picture = GraphicsJNI::getNativePicture(env, pict);
8866d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    GET_NATIVE_VIEW(env, obj)->copyBaseContentToPicture(picture);
8876d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
8886d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
8896d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic bool nativeHasContent(JNIEnv *env, jobject obj)
8906d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
8916d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    return GET_NATIVE_VIEW(env, obj)->hasContent();
892f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark}
893f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark
8949092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clarkstatic jobject nativeLayerBounds(JNIEnv* env, jobject obj, jint jlayer)
8959092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark{
8969092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    SkRect r;
8979092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark#if USE(ACCELERATED_COMPOSITING)
8989092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    LayerAndroid* layer = (LayerAndroid*) jlayer;
8999092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    r = layer->bounds();
9009092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark#else
9019092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    r.setEmpty();
9029092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark#endif
9039092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    SkIRect irect;
9049092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    r.round(&irect);
9059092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    jclass rectClass = env->FindClass("android/graphics/Rect");
9069092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V");
9079092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    jobject rect = env->NewObject(rectClass, init, irect.fLeft, irect.fTop,
9089092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark        irect.fRight, irect.fBottom);
9099092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    env->DeleteLocalRef(rectClass);
9109092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    return rect;
9119092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark}
9129092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark
9138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeSetHeightCanMeasure(JNIEnv *env, jobject obj, bool measure)
9148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
9166dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(view, "view not set in nativeSetHeightCanMeasure");
9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    view->setHeightCanMeasure(measure);
9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeDestroy(JNIEnv *env, jobject obj)
9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
923a09e7cf49f43950a799f936bf42a9912d696547bSteve Block    ALOGD("nativeDestroy view: %p", view);
9246dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(view, "view not set in nativeDestroy");
9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete view;
9268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9288360bc9c9facd690e42379610cbbb368d3d705efCary Clarkstatic void nativeStopGL(JNIEnv *env, jobject obj)
9298360bc9c9facd690e42379610cbbb368d3d705efCary Clark{
9308360bc9c9facd690e42379610cbbb368d3d705efCary Clark    GET_NATIVE_VIEW(env, obj)->stopGL();
9318360bc9c9facd690e42379610cbbb368d3d705efCary Clark}
9328360bc9c9facd690e42379610cbbb368d3d705efCary Clark
9338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jobject nativeGetSelection(JNIEnv *env, jobject obj)
9348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
9366dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(view, "view not set in %s", __FUNCTION__);
9375e5962825729a211e093fd615ddc9e5b0bec10bdCary Clark    String selection = view->getSelection();
93879b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block    return wtfStringToJstring(env, selection);
9398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
941a3a38731f4eeb01d2a42965b6c875d957999969dChris Craikstatic void nativeDiscardAllTextures(JNIEnv *env, jobject obj)
942a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik{
943a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik    //discard all textures for debugging/test purposes, but not gl backing memory
944a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik    bool allTextures = true, deleteGLTextures = false;
945a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik    TilesManager::instance()->discardTextures(allTextures, deleteGLTextures);
946af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik}
947af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik
9485dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic void nativeTileProfilingStart(JNIEnv *env, jobject obj)
9495dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
950687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    TilesManager::instance()->getProfiler()->start();
9515dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
9525dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
9535dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic float nativeTileProfilingStop(JNIEnv *env, jobject obj)
9545dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
955687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    return TilesManager::instance()->getProfiler()->stop();
9565dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
9575dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
9585dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic void nativeTileProfilingClear(JNIEnv *env, jobject obj)
9595dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
960687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    TilesManager::instance()->getProfiler()->clear();
9615dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
9625dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
9635dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic int nativeTileProfilingNumFrames(JNIEnv *env, jobject obj)
9645dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
965687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    return TilesManager::instance()->getProfiler()->numFrames();
9665dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
9675dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
9685dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic int nativeTileProfilingNumTilesInFrame(JNIEnv *env, jobject obj, int frame)
9695dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
970687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    return TilesManager::instance()->getProfiler()->numTilesInFrame(frame);
9715dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
9725dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
973687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craikstatic int nativeTileProfilingGetInt(JNIEnv *env, jobject obj, int frame, int tile, jstring jkey)
9745dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
975687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    WTF::String key = jstringToWtfString(env, jkey);
976687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    TileProfileRecord* record = TilesManager::instance()->getProfiler()->getTile(frame, tile);
977687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik
978687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    if (key == "left")
979687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        return record->left;
980687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    if (key == "top")
981687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        return record->top;
982687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    if (key == "right")
983687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        return record->right;
984687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    if (key == "bottom")
985687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        return record->bottom;
986687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    if (key == "level")
987687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        return record->level;
988687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    if (key == "isReady")
989687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        return record->isReady ? 1 : 0;
990687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    return -1;
9915dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
9925dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
993687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craikstatic float nativeTileProfilingGetFloat(JNIEnv *env, jobject obj, int frame, int tile, jstring jkey)
9945dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
995687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    TileProfileRecord* record = TilesManager::instance()->getProfiler()->getTile(frame, tile);
996687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    return record->scale;
9975dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
9985dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
9998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_DUMP_DISPLAY_TREE
10008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void dumpToFile(const char text[], void* file) {
10018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fwrite(text, 1, strlen(text), reinterpret_cast<FILE*>(file));
10028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fwrite("\n", 1, 1, reinterpret_cast<FILE*>(file));
10038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
10058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1006c2992cfb02b098d6e8579b6a0ba7f7a11c7753feJohn Reck// Return true to view invalidate WebView
1007f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roardstatic bool nativeSetProperty(JNIEnv *env, jobject obj, jstring jkey, jstring jvalue)
1008d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck{
1009d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck    WTF::String key = jstringToWtfString(env, jkey);
1010d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck    WTF::String value = jstringToWtfString(env, jvalue);
1011ef238925ea0ba6305e4540aff5c6953503993f3bNicolas Roard    if (key == "inverted") {
1012bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik        bool shouldInvert = (value == "true");
1013bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik        TilesManager::instance()->setInvertedScreen(shouldInvert);
1014f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard        return true;
1015d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck    }
10168852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu    else if (key == "inverted_contrast") {
1017bbb9caa2571e2c0192861a336c358412e9e7f0c7Nicolas Roard        float contrast = value.toFloat();
1018bbb9caa2571e2c0192861a336c358412e9e7f0c7Nicolas Roard        TilesManager::instance()->setInvertedScreenContrast(contrast);
1019f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard        return true;
1020bbb9caa2571e2c0192861a336c358412e9e7f0c7Nicolas Roard    }
10218852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu    else if (key == "enable_cpu_upload_path") {
10220960fe0e966317c4728542e9cfaa259523665900Teng-Hui Zhu        TilesManager::instance()->transferQueue()->setTextureUploadType(
10230960fe0e966317c4728542e9cfaa259523665900Teng-Hui Zhu            value == "true" ? CpuUpload : GpuUpload);
10240960fe0e966317c4728542e9cfaa259523665900Teng-Hui Zhu    }
10258852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu    else if (key == "use_minimal_memory") {
10268852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu        TilesManager::instance()->setUseMinimalMemory(value == "true");
10278852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu    }
1028bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik    else if (key == "use_double_buffering") {
1029bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik        TilesManager::instance()->setUseDoubleBuffering(value == "true");
1030bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik    }
1031bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik    else if (key == "tree_updates") {
1032d8be9016b7fda67a91b4ee17b3b2e7ba692ee553Chris Craik        TilesManager::instance()->clearContentUpdates();
1033bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik    }
1034f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard    return false;
1035d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck}
1036d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck
1037bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craikstatic jstring nativeGetProperty(JNIEnv *env, jobject obj, jstring jkey)
1038d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck{
1039bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik    WTF::String key = jstringToWtfString(env, jkey);
1040bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik    if (key == "tree_updates") {
1041d8be9016b7fda67a91b4ee17b3b2e7ba692ee553Chris Craik        int updates = TilesManager::instance()->getContentUpdates();
1042bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik        WTF::String wtfUpdates = WTF::String::number(updates);
1043bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik        return wtfStringToJstring(env, wtfUpdates);
1044bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik    }
1045d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck    return 0;
1046d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck}
1047d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck
104852f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reckstatic void nativeOnTrimMemory(JNIEnv *env, jobject obj, jint level)
104952f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck{
10502986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik    if (TilesManager::hardwareAccelerationEnabled()) {
1051e1dfe84b38ed080c7bb7ac00fd9e3c6c590a147dTeng-Hui Zhu        // When we got TRIM_MEMORY_MODERATE or TRIM_MEMORY_COMPLETE, we should
1052e1dfe84b38ed080c7bb7ac00fd9e3c6c590a147dTeng-Hui Zhu        // make sure the transfer queue is empty and then abandon the Surface
1053e1dfe84b38ed080c7bb7ac00fd9e3c6c590a147dTeng-Hui Zhu        // Texture to avoid ANR b/c framework may destroy the EGL context.
1054e1dfe84b38ed080c7bb7ac00fd9e3c6c590a147dTeng-Hui Zhu        // Refer to WindowManagerImpl.java for conditions we followed.
105500144be011338276839a08a66ae79b14629b268bTeng-Hui Zhu        TilesManager* tilesManager = TilesManager::instance();
1056e1dfe84b38ed080c7bb7ac00fd9e3c6c590a147dTeng-Hui Zhu        if (level >= TRIM_MEMORY_MODERATE
105700144be011338276839a08a66ae79b14629b268bTeng-Hui Zhu            && !tilesManager->highEndGfx()) {
10580f1c02efd8cc889db10575dff2749d103ceeaf87Teng-Hui Zhu            ALOGD("OnTrimMemory with EGL Context %p", eglGetCurrentContext());
105900144be011338276839a08a66ae79b14629b268bTeng-Hui Zhu            tilesManager->transferQueue()->emptyQueue();
106000144be011338276839a08a66ae79b14629b268bTeng-Hui Zhu            tilesManager->shader()->cleanupGLResources();
106100144be011338276839a08a66ae79b14629b268bTeng-Hui Zhu            tilesManager->videoLayerManager()->cleanupGLResources();
1062886eb87d34570b706a0f17fa944d98870ed6a2afTeng-Hui Zhu        }
1063e1dfe84b38ed080c7bb7ac00fd9e3c6c590a147dTeng-Hui Zhu
1064a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik        bool freeAllTextures = (level > TRIM_MEMORY_UI_HIDDEN), glTextures = true;
106500144be011338276839a08a66ae79b14629b268bTeng-Hui Zhu        tilesManager->discardTextures(freeAllTextures, glTextures);
10662986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik    }
106752f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck}
106852f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck
10698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeDumpDisplayTree(JNIEnv* env, jobject jwebview, jstring jurl)
10708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_DUMP_DISPLAY_TREE
10728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, jwebview);
10736dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(view, "view not set in %s", __FUNCTION__);
10748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1075bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed    if (view && view->getWebViewCore()) {
1076bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed        FILE* file = fopen(DISPLAY_TREE_LOG_FILE, "w");
1077bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed        if (file) {
1078bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            SkFormatDumper dumper(dumpToFile, file);
1079bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // dump the URL
1080bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            if (jurl) {
1081bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed                const char* str = env->GetStringUTFChars(jurl, 0);
1082bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed                SkDebugf("Dumping %s to %s\n", str, DISPLAY_TREE_LOG_FILE);
1083bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed                dumpToFile(str, file);
1084bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed                env->ReleaseStringUTFChars(jurl, str);
10858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
1086bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // now dump the display tree
1087bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            SkDumpCanvas canvas(&dumper);
1088bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // this will playback the picture into the canvas, which will
1089bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // spew its contents to the dumper
1090dea0c131566f424923425970fe5621305d136e5aJohn Reck            view->draw(&canvas, 0, WebView::DrawExtrasNone, false);
1091bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // we're done with the file now
1092bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            fwrite("\n", 1, 1, file);
1093bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            fclose(file);
10948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1095859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
1096885e650b12d781be054b31ae6221925a0184dc33Chris Craik        const LayerAndroid* baseLayer = view->getBaseLayer();
1097885e650b12d781be054b31ae6221925a0184dc33Chris Craik        if (baseLayer) {
1098859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard          FILE* file = fopen(LAYERS_TREE_LOG_FILE,"w");
1099859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard          if (file) {
1100885e650b12d781be054b31ae6221925a0184dc33Chris Craik              baseLayer->dumpLayers(file, 0);
1101859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard              fclose(file);
1102859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard          }
1103859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard        }
1104859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard#endif
11058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
11078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1109f81c672a4f5c06621000a6df0984cde689397d94Cary Clarkstatic int nativeScrollableLayer(JNIEnv* env, jobject jwebview, jint x, jint y,
1110f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    jobject rect, jobject bounds)
1111a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{
1112a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    WebView* view = GET_NATIVE_VIEW(env, jwebview);
11136dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(view, "view not set in %s", __FUNCTION__);
1114f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    SkIRect nativeRect, nativeBounds;
1115f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    int id = view->scrollableLayer(x, y, &nativeRect, &nativeBounds);
1116f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins    if (rect)
1117f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins        GraphicsJNI::irect_to_jrect(nativeRect, env, rect);
1118f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins    if (bounds)
1119f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins        GraphicsJNI::irect_to_jrect(nativeBounds, env, bounds);
112022e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott    return id;
1121a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott}
1122a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott
112322e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scottstatic bool nativeScrollLayer(JNIEnv* env, jobject obj, jint layerId, jint x,
112422e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott        jint y)
1125a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{
1126a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL)
1127a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    WebView* view = GET_NATIVE_VIEW(env, obj);
112870adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik    view->scrollLayer(layerId, x, y);
112970adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik
113070adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik    //TODO: the below only needed for the SW rendering path
1131885e650b12d781be054b31ae6221925a0184dc33Chris Craik    LayerAndroid* baseLayer = view->getBaseLayer();
1132885e650b12d781be054b31ae6221925a0184dc33Chris Craik    if (!baseLayer)
11338598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott        return false;
1134885e650b12d781be054b31ae6221925a0184dc33Chris Craik    LayerAndroid* layer = baseLayer->findById(layerId);
1135fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott    if (!layer || !layer->contentIsScrollable())
1136a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        return false;
1137fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott    return static_cast<ScrollableLayerAndroid*>(layer)->scrollTo(x, y);
1138a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#endif
1139a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    return false;
1140a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott}
1141a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott
1142f51a51f6ea307f4311a04aa865a42b233269540bChris Craikstatic void nativeSetIsScrolling(JNIEnv* env, jobject jwebview, jboolean isScrolling)
1143f51a51f6ea307f4311a04aa865a42b233269540bChris Craik{
1144f51a51f6ea307f4311a04aa865a42b233269540bChris Craik    WebView* view = GET_NATIVE_VIEW(env, jwebview);
11456dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(view, "view not set in %s", __FUNCTION__);
1146f51a51f6ea307f4311a04aa865a42b233269540bChris Craik    view->setIsScrolling(isScrolling);
1147f51a51f6ea307f4311a04aa865a42b233269540bChris Craik}
1148f51a51f6ea307f4311a04aa865a42b233269540bChris Craik
1149c7e578330aece3c556ef205365c24676687223e2Derek Sollenbergerstatic void nativeUseHardwareAccelSkia(JNIEnv*, jobject, jboolean enabled)
1150c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger{
1151c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger    BaseRenderer::setCurrentRendererType(enabled ? BaseRenderer::Ganesh : BaseRenderer::Raster);
1152c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger}
1153c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger
11545e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reckstatic int nativeGetBackgroundColor(JNIEnv* env, jobject obj)
11555e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck{
11565e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck    WebView* view = GET_NATIVE_VIEW(env, obj);
11575e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck    BaseLayerAndroid* baseLayer = view->getBaseLayer();
11585e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck    if (baseLayer) {
11595e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck        WebCore::Color color = baseLayer->getBackgroundColor();
11605e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck        if (color.isValid())
11615e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck            return SkColorSetARGB(color.alpha(), color.red(),
11625e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck                                  color.green(), color.blue());
11635e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck    }
11645e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck    return SK_ColorWHITE;
11655e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck}
11665e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck
1167d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reckstatic void nativeSetPauseDrawing(JNIEnv *env, jobject obj, jint nativeView,
1168d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck                                      jboolean pause)
1169d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck{
1170d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck    ((WebView*)nativeView)->m_isDrawingPaused = pause;
1171d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck}
1172d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck
1173dea0c131566f424923425970fe5621305d136e5aJohn Reckstatic void nativeSetTextSelection(JNIEnv *env, jobject obj, jint nativeView,
1174dea0c131566f424923425970fe5621305d136e5aJohn Reck                                   jint selectionPtr)
1175dea0c131566f424923425970fe5621305d136e5aJohn Reck{
1176dea0c131566f424923425970fe5621305d136e5aJohn Reck    SelectText* selection = reinterpret_cast<SelectText*>(selectionPtr);
1177dea0c131566f424923425970fe5621305d136e5aJohn Reck    reinterpret_cast<WebView*>(nativeView)->setTextSelection(selection);
1178dea0c131566f424923425970fe5621305d136e5aJohn Reck}
1179dea0c131566f424923425970fe5621305d136e5aJohn Reck
1180dea0c131566f424923425970fe5621305d136e5aJohn Reckstatic jint nativeGetHandleLayerId(JNIEnv *env, jobject obj, jint nativeView,
1181304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount                                     jint handleIndex, jobject cursorPoint,
1182304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount                                     jobject textQuad)
1183dea0c131566f424923425970fe5621305d136e5aJohn Reck{
1184dea0c131566f424923425970fe5621305d136e5aJohn Reck    WebView* webview = reinterpret_cast<WebView*>(nativeView);
1185304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    SkIPoint nativePoint;
1186304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    FloatQuad nativeTextQuad;
1187304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    int layerId = webview->getHandleLayerId((SelectText::HandleId) handleIndex,
1188304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount            nativePoint, nativeTextQuad);
1189304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    if (cursorPoint)
1190304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount        GraphicsJNI::ipoint_to_jpoint(nativePoint, env, cursorPoint);
1191304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    if (textQuad)
1192304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount        webview->floatQuadToQuadF(env, nativeTextQuad, textQuad);
1193dea0c131566f424923425970fe5621305d136e5aJohn Reck    return layerId;
1194dea0c131566f424923425970fe5621305d136e5aJohn Reck}
1195dea0c131566f424923425970fe5621305d136e5aJohn Reck
1196dea0c131566f424923425970fe5621305d136e5aJohn Reckstatic jboolean nativeIsBaseFirst(JNIEnv *env, jobject obj, jint nativeView)
1197dea0c131566f424923425970fe5621305d136e5aJohn Reck{
1198dea0c131566f424923425970fe5621305d136e5aJohn Reck    WebView* webview = reinterpret_cast<WebView*>(nativeView);
1199dea0c131566f424923425970fe5621305d136e5aJohn Reck    SelectText* select = static_cast<SelectText*>(
1200dea0c131566f424923425970fe5621305d136e5aJohn Reck            webview->getDrawExtra(WebView::DrawExtrasSelection));
1201dea0c131566f424923425970fe5621305d136e5aJohn Reck    return select ? select->isBaseFirst() : false;
1202dea0c131566f424923425970fe5621305d136e5aJohn Reck}
1203dea0c131566f424923425970fe5621305d136e5aJohn Reck
1204730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mountstatic void nativeMapLayerRect(JNIEnv *env, jobject obj, jint nativeView,
1205730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount        jint layerId, jobject rect)
1206730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount{
1207730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount    WebView* webview = reinterpret_cast<WebView*>(nativeView);
1208730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount    SkIRect nativeRect;
1209730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount    GraphicsJNI::jrect_to_irect(env, rect, &nativeRect);
1210730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount    webview->mapLayerRect(layerId, nativeRect);
1211730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount    GraphicsJNI::irect_to_jrect(nativeRect, env, rect);
1212730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount}
1213730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount
1214a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reckstatic jint nativeSetHwAccelerated(JNIEnv *env, jobject obj, jint nativeView,
1215a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck        jboolean hwAccelerated)
1216a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck{
1217a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck    WebView* webview = reinterpret_cast<WebView*>(nativeView);
1218a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck    return webview->setHwAccelerated(hwAccelerated);
1219a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck}
1220a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck
12218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
12228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * JNI registration
12238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
12248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic JNINativeMethod gJavaWebViewMethods[] = {
122555b4bdbd661ac94fd05ab40de08250bf242d5346John Reck    { "nativeCreate", "(ILjava/lang/String;Z)V",
12268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeCreate },
12278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeDestroy", "()V",
12288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeDestroy },
1229a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    { "nativeDraw", "(Landroid/graphics/Canvas;Landroid/graphics/RectF;IIZ)I",
12306d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeDraw },
1231a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    { "nativeGetDrawGLFunction", "(ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/RectF;FI)I",
1232908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        (void*) nativeGetDrawGLFunction },
1233d0a011b30b97598ee74f329aaa217a6ab733f1f1Teng-Hui Zhu    { "nativeUpdateDrawGLFunction", "(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/RectF;F)V",
1234908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        (void*) nativeUpdateDrawGLFunction },
123546dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeDumpDisplayTree", "(Ljava/lang/String;)V",
123646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeDumpDisplayTree },
1237223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck    { "nativeEvaluateLayersAnimations", "(I)Z",
123887962ce00229855c098ba12cee8d5c015a835289Cary Clark        (void*) nativeEvaluateLayersAnimations },
12395e5962825729a211e093fd615ddc9e5b0bec10bdCary Clark    { "nativeGetSelection", "()Ljava/lang/String;",
124046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeGetSelection },
12419092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    { "nativeLayerBounds", "(I)Landroid/graphics/Rect;",
12429092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark        (void*) nativeLayerBounds },
12438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeSetHeightCanMeasure", "(Z)V",
12448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeSetHeightCanMeasure },
1245246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik    { "nativeSetBaseLayer", "(IILandroid/graphics/Region;ZZ)Z",
12466d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeSetBaseLayer },
12474212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck    { "nativeGetBaseLayer", "()I",
12484212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck        (void*) nativeGetBaseLayer },
12496d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    { "nativeReplaceBaseContent", "(I)V",
12506d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeReplaceBaseContent },
12516d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    { "nativeCopyBaseContentToPicture", "(Landroid/graphics/Picture;)V",
12526d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeCopyBaseContentToPicture },
12536d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    { "nativeHasContent", "()Z",
12546d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeHasContent },
1255a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik    { "nativeDiscardAllTextures", "()V",
1256a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik        (void*) nativeDiscardAllTextures },
12575dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik    { "nativeTileProfilingStart", "()V",
12585dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik        (void*) nativeTileProfilingStart },
12595dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik    { "nativeTileProfilingStop", "()F",
12605dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik        (void*) nativeTileProfilingStop },
12615dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik    { "nativeTileProfilingClear", "()V",
12625dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik        (void*) nativeTileProfilingClear },
12635dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik    { "nativeTileProfilingNumFrames", "()I",
12645dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik        (void*) nativeTileProfilingNumFrames },
12655dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik    { "nativeTileProfilingNumTilesInFrame", "(I)I",
12665dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik        (void*) nativeTileProfilingNumTilesInFrame },
1267687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    { "nativeTileProfilingGetInt", "(IILjava/lang/String;)I",
1268687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        (void*) nativeTileProfilingGetInt },
1269687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    { "nativeTileProfilingGetFloat", "(IILjava/lang/String;)F",
1270687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        (void*) nativeTileProfilingGetFloat },
12718360bc9c9facd690e42379610cbbb368d3d705efCary Clark    { "nativeStopGL", "()V",
12728360bc9c9facd690e42379610cbbb368d3d705efCary Clark        (void*) nativeStopGL },
1273f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    { "nativeScrollableLayer", "(IILandroid/graphics/Rect;Landroid/graphics/Rect;)I",
1274a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        (void*) nativeScrollableLayer },
1275a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    { "nativeScrollLayer", "(III)Z",
1276a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        (void*) nativeScrollLayer },
1277f51a51f6ea307f4311a04aa865a42b233269540bChris Craik    { "nativeSetIsScrolling", "(Z)V",
1278f51a51f6ea307f4311a04aa865a42b233269540bChris Craik        (void*) nativeSetIsScrolling },
1279c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger    { "nativeUseHardwareAccelSkia", "(Z)V",
1280c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger        (void*) nativeUseHardwareAccelSkia },
12815e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck    { "nativeGetBackgroundColor", "()I",
12825e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck        (void*) nativeGetBackgroundColor },
1283f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard    { "nativeSetProperty", "(Ljava/lang/String;Ljava/lang/String;)Z",
1284d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck        (void*) nativeSetProperty },
1285d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck    { "nativeGetProperty", "(Ljava/lang/String;)Ljava/lang/String;",
1286d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck        (void*) nativeGetProperty },
128752f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck    { "nativeOnTrimMemory", "(I)V",
128852f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck        (void*) nativeOnTrimMemory },
1289d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck    { "nativeSetPauseDrawing", "(IZ)V",
1290d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck        (void*) nativeSetPauseDrawing },
1291dea0c131566f424923425970fe5621305d136e5aJohn Reck    { "nativeSetTextSelection", "(II)V",
1292dea0c131566f424923425970fe5621305d136e5aJohn Reck        (void*) nativeSetTextSelection },
1293304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    { "nativeGetHandleLayerId", "(IILandroid/graphics/Point;Landroid/webkit/QuadF;)I",
1294dea0c131566f424923425970fe5621305d136e5aJohn Reck        (void*) nativeGetHandleLayerId },
1295dea0c131566f424923425970fe5621305d136e5aJohn Reck    { "nativeIsBaseFirst", "(I)Z",
1296dea0c131566f424923425970fe5621305d136e5aJohn Reck        (void*) nativeIsBaseFirst },
1297730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount    { "nativeMapLayerRect", "(IILandroid/graphics/Rect;)V",
1298730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount        (void*) nativeMapLayerRect },
1299a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck    { "nativeSetHwAccelerated", "(IZ)I",
1300a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck        (void*) nativeSetHwAccelerated },
13018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
13028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1303b92850e0391d674b9c4826b66105aaa3dd3eef96Steve Blockint registerWebView(JNIEnv* env)
13048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
130557ae1393d3097edada2640b40c895396b69cc919Jonathan Dixon    jclass clazz = env->FindClass("android/webkit/WebViewClassic");
130657ae1393d3097edada2640b40c895396b69cc919Jonathan Dixon    ALOG_ASSERT(clazz, "Unable to find class android/webkit/WebViewClassic");
13078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    gWebViewField = env->GetFieldID(clazz, "mNativeClass", "I");
130857ae1393d3097edada2640b40c895396b69cc919Jonathan Dixon    ALOG_ASSERT(gWebViewField, "Unable to find android/webkit/WebViewClassic.mNativeClass");
1309bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(clazz);
13108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
131157ae1393d3097edada2640b40c895396b69cc919Jonathan Dixon    return jniRegisterNativeMethods(env, "android/webkit/WebViewClassic", gJavaWebViewMethods, NELEM(gJavaWebViewMethods));
13128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace android
1315