WebView.cpp revision 829229abf10ddf6135c682d42a291925ef0da35f
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);
307829229abf10ddf6135c682d42a291925ef0da35fTeng-Hui Zhu    int contentWidth = 0;
308829229abf10ddf6135c682d42a291925ef0da35fTeng-Hui Zhu    int contentHeight = 0;
309829229abf10ddf6135c682d42a291925ef0da35fTeng-Hui Zhu    if (content) {
310829229abf10ddf6135c682d42a291925ef0da35fTeng-Hui Zhu        contentWidth = content->width();
311829229abf10ddf6135c682d42a291925ef0da35fTeng-Hui Zhu        contentHeight = content->height();
312829229abf10ddf6135c682d42a291925ef0da35fTeng-Hui Zhu    }
313829229abf10ddf6135c682d42a291925ef0da35fTeng-Hui Zhu    canvas->clipRect(SkRect::MakeLTRB(0, 0, contentWidth, contentHeight),
314829229abf10ddf6135c682d42a291925ef0da35fTeng-Hui Zhu                     SkRegion::kDifference_Op);
31575fc360d144b97f5e50bedf7ed3222898cc56446Chris Craik    Color c = m_baseLayer->getBackgroundColor();
31675fc360d144b97f5e50bedf7ed3222898cc56446Chris Craik    canvas->drawColor(SkColorSetARGBInline(c.alpha(), c.red(), c.green(), c.blue()));
3176d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    canvas->restoreToCount(sc);
3186d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
319885e650b12d781be054b31ae6221925a0184dc33Chris Craik    // call this to be sure we've adjusted for any scrolling or animations
320885e650b12d781be054b31ae6221925a0184dc33Chris Craik    // before we actually draw
321885e650b12d781be054b31ae6221925a0184dc33Chris Craik    m_baseLayer->updateLayerPositions(m_visibleRect);
322885e650b12d781be054b31ae6221925a0184dc33Chris Craik    m_baseLayer->updatePositions();
323885e650b12d781be054b31ae6221925a0184dc33Chris Craik
324885e650b12d781be054b31ae6221925a0184dc33Chris Craik    // We have to set the canvas' matrix on the base layer
325885e650b12d781be054b31ae6221925a0184dc33Chris Craik    // (to have fixed layers work as intended)
326885e650b12d781be054b31ae6221925a0184dc33Chris Craik    SkAutoCanvasRestore restore(canvas, true);
327885e650b12d781be054b31ae6221925a0184dc33Chris Craik    m_baseLayer->setMatrix(canvas->getTotalMatrix());
328885e650b12d781be054b31ae6221925a0184dc33Chris Craik    canvas->resetMatrix();
329885e650b12d781be054b31ae6221925a0184dc33Chris Craik    m_baseLayer->draw(canvas, getDrawExtra(extras));
330dea0c131566f424923425970fe5621305d136e5aJohn Reck
3316d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    return ret;
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint getScaledMaxXScroll()
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3366dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
338b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
339b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
340b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return 0;
341b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    int result = env->CallIntMethod(javaObject.get(), m_javaGlue.m_getScaledMaxXScroll);
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint getScaledMaxYScroll()
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3486dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
350b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
351b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
352b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return 0;
353b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    int result = env->CallIntMethod(javaObject.get(), m_javaGlue.m_getScaledMaxYScroll);
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
358af03a3d6830584ef606be2d1c64845815dadb146Cary ClarkIntRect getVisibleRect()
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
360af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    IntRect rect;
3616dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
363b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
364b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
365b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return rect;
366b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    jobject jRect = env->CallObjectMethod(javaObject.get(), m_javaGlue.m_getVisibleRect);
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
368af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    rect.setX(env->GetIntField(jRect, m_javaGlue.m_rectLeft));
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
370af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    rect.setY(env->GetIntField(jRect, m_javaGlue.m_rectTop));
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
372af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    rect.setWidth(env->CallIntMethod(jRect, m_javaGlue.m_rectWidth));
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
374af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    rect.setHeight(env->CallIntMethod(jRect, m_javaGlue.m_rectHeight));
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    env->DeleteLocalRef(jRect);
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
378af03a3d6830584ef606be2d1c64845815dadb146Cary Clark    return rect;
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38182f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if USE(ACCELERATED_COMPOSITING)
382f81c672a4f5c06621000a6df0984cde689397d94Cary Clarkstatic const ScrollableLayerAndroid* findScrollableLayer(
383f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    const LayerAndroid* parent, int x, int y, SkIRect* foundBounds) {
38482f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    SkRect bounds;
38582f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    parent->bounds(&bounds);
38682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    // Check the parent bounds first; this will clip to within a masking layer's
38782f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    // bounds.
388fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott    if (parent->masksToBounds() && !bounds.contains(x, y))
38982f247bdbb98dd80c44209d87692c650c3704617Patrick Scott        return 0;
39082f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    // Move the hit test local to parent.
39182f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    x -= bounds.fLeft;
39282f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    y -= bounds.fTop;
39382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    int count = parent->countChildren();
3941a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott    while (count--) {
3951a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott        const LayerAndroid* child = parent->getChild(count);
396f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        const ScrollableLayerAndroid* result = findScrollableLayer(child, x, y,
397f81c672a4f5c06621000a6df0984cde689397d94Cary Clark            foundBounds);
398f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        if (result) {
399f81c672a4f5c06621000a6df0984cde689397d94Cary Clark            foundBounds->offset(bounds.fLeft, bounds.fTop);
400f81c672a4f5c06621000a6df0984cde689397d94Cary Clark            if (parent->masksToBounds()) {
401f81c672a4f5c06621000a6df0984cde689397d94Cary Clark                if (bounds.width() < foundBounds->width())
402f81c672a4f5c06621000a6df0984cde689397d94Cary Clark                    foundBounds->fRight = foundBounds->fLeft + bounds.width();
403f81c672a4f5c06621000a6df0984cde689397d94Cary Clark                if (bounds.height() < foundBounds->height())
404f81c672a4f5c06621000a6df0984cde689397d94Cary Clark                    foundBounds->fBottom = foundBounds->fTop + bounds.height();
405f81c672a4f5c06621000a6df0984cde689397d94Cary Clark            }
40682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott            return result;
407f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        }
40882f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    }
409f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    if (parent->contentIsScrollable()) {
410f81c672a4f5c06621000a6df0984cde689397d94Cary Clark        foundBounds->set(0, 0, bounds.width(), bounds.height());
411fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott        return static_cast<const ScrollableLayerAndroid*>(parent);
412f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    }
41382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott    return 0;
41482f247bdbb98dd80c44209d87692c650c3704617Patrick Scott}
41582f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif
41682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott
417f81c672a4f5c06621000a6df0984cde689397d94Cary Clarkint scrollableLayer(int x, int y, SkIRect* layerRect, SkIRect* bounds)
418a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{
41982f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if USE(ACCELERATED_COMPOSITING)
420885e650b12d781be054b31ae6221925a0184dc33Chris Craik    if (!m_baseLayer)
421a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        return 0;
422885e650b12d781be054b31ae6221925a0184dc33Chris Craik    const ScrollableLayerAndroid* result = findScrollableLayer(m_baseLayer, x, y, bounds);
42322e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott    if (result) {
42422e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott        result->getScrollRect(layerRect);
4258598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott        return result->uniqueId();
42622e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott    }
427a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#endif
428a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    return 0;
429a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott}
430a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott
43170adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craikvoid scrollLayer(int layerId, int x, int y)
43270adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik{
43370adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik    if (m_glWebViewState)
43470adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik        m_glWebViewState->scrollLayer(layerId, x, y);
43570adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik}
43670adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid setHeightCanMeasure(bool measure)
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_heightCanMeasure = measure;
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44287962ce00229855c098ba12cee8d5c015a835289Cary ClarkString getSelection()
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
444dea0c131566f424923425970fe5621305d136e5aJohn Reck    SelectText* select = static_cast<SelectText*>(
445dea0c131566f424923425970fe5621305d136e5aJohn Reck            getDrawExtra(WebView::DrawExtrasSelection));
446dea0c131566f424923425970fe5621305d136e5aJohn Reck    if (select)
447dea0c131566f424923425970fe5621305d136e5aJohn Reck        return select->getText();
448dea0c131566f424923425970fe5621305d136e5aJohn Reck    return String();
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45151c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scrogginsbool scrollBy(int dx, int dy)
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4536dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
456b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
457b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
458b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return false;
459b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    bool result = env->CallBooleanMethod(javaObject.get(), m_javaGlue.m_scrollBy, dx, dy, true);
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
46151c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins    return result;
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
464f51a51f6ea307f4311a04aa865a42b233269540bChris Craikvoid setIsScrolling(bool isScrolling)
465f51a51f6ea307f4311a04aa865a42b233269540bChris Craik{
466ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch#if USE(ACCELERATED_COMPOSITING)
467ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch    if (m_glWebViewState)
468ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch        m_glWebViewState->setIsScrolling(isScrolling);
469ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch#endif
470f51a51f6ea307f4311a04aa865a42b233269540bChris Craik}
471f51a51f6ea307f4311a04aa865a42b233269540bChris Craik
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid viewInvalidate()
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
475b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
476b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
477b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
478b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_viewInvalidate);
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid viewInvalidateRect(int l, int t, int r, int b)
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
485b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
486b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
487b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
488b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_viewInvalidateRect, l, r, t, b);
4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid postInvalidateDelayed(int64_t delay, const WebCore::IntRect& bounds)
4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JNIEnv* env = JSC::Bindings::getJNIEnv();
495b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    AutoJObject javaObject = m_javaGlue.object(env);
496b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    if (!javaObject.get())
497b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block        return;
498b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block    env->CallVoidMethod(javaObject.get(), m_javaGlue.m_postInvalidateDelayed,
4991ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block        delay, bounds.x(), bounds.y(), bounds.maxX(), bounds.maxY());
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkException(env);
5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL)
504a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scottstatic void copyScrollPositionRecursive(const LayerAndroid* from,
505a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott                                        LayerAndroid* root)
506a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{
507a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    if (!from || !root)
508a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        return;
509a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    for (int i = 0; i < from->countChildren(); i++) {
510a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        const LayerAndroid* l = from->getChild(i);
511a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        if (l->contentIsScrollable()) {
51282f247bdbb98dd80c44209d87692c650c3704617Patrick Scott            const SkPoint& pos = l->getPosition();
51382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott            LayerAndroid* match = root->findById(l->uniqueId());
51482f247bdbb98dd80c44209d87692c650c3704617Patrick Scott            if (match && match->contentIsScrollable())
51582f247bdbb98dd80c44209d87692c650c3704617Patrick Scott                match->setPosition(pos.fX, pos.fY);
516a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        }
517a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        copyScrollPositionRecursive(l, root);
518a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    }
519a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott}
52082f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif
521a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott
522885e650b12d781be054b31ae6221925a0184dc33Chris CraikBaseLayerAndroid* getBaseLayer() const { return m_baseLayer; }
523885e650b12d781be054b31ae6221925a0184dc33Chris Craik
524885e650b12d781be054b31ae6221925a0184dc33Chris Craikbool setBaseLayer(BaseLayerAndroid* newBaseLayer, SkRegion& inval, bool showVisualIndicator,
525246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik                  bool isPictureAfterFirstLayout)
526f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{
527246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik    bool queueFull = false;
528a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
529246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik    if (m_glWebViewState) {
530885e650b12d781be054b31ae6221925a0184dc33Chris Craik        // TODO: mark as inval on webkit side
531885e650b12d781be054b31ae6221925a0184dc33Chris Craik        if (newBaseLayer)
532885e650b12d781be054b31ae6221925a0184dc33Chris Craik            newBaseLayer->markAsDirty(inval);
533885e650b12d781be054b31ae6221925a0184dc33Chris Craik        queueFull = m_glWebViewState->setBaseLayer(newBaseLayer, showVisualIndicator,
534246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik                                                   isPictureAfterFirstLayout);
535246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik    }
536a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
537a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
53882f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL)
539885e650b12d781be054b31ae6221925a0184dc33Chris Craik    if (newBaseLayer) {
540885e650b12d781be054b31ae6221925a0184dc33Chris Craik        // TODO: the below tree position copies are only necessary in software rendering
541885e650b12d781be054b31ae6221925a0184dc33Chris Craik        copyScrollPositionRecursive(m_baseLayer, newBaseLayer);
542cf6e10e145f44cab3eb70f3782b51a92cf61ae7dShimeng (Simon) Wang    }
54382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif
544b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger    SkSafeUnref(m_baseLayer);
545885e650b12d781be054b31ae6221925a0184dc33Chris Craik    m_baseLayer = newBaseLayer;
546246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik
547246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik    return queueFull;
5486d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
5496d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
5506d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobavoid replaceBaseContent(PictureSet* set)
5516d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
5526d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (!m_baseLayer)
5536d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return;
554b3f4d3af0b06dc168453641e249d0cb9eec9b570Nicolas Roard    // TODO: remove the split picture codepath
5556d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    delete set;
5566d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
5576d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
5586d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobavoid copyBaseContentToPicture(SkPicture* picture)
5596d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
5606d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (!m_baseLayer)
5616d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return;
562b3f4d3af0b06dc168453641e249d0cb9eec9b570Nicolas Roard    LayerContent* content = m_baseLayer->content();
563885e650b12d781be054b31ae6221925a0184dc33Chris Craik    content->draw(picture->beginRecording(content->width(), content->height(),
564885e650b12d781be054b31ae6221925a0184dc33Chris Craik                                          SkPicture::kUsePathBoundsForClip_RecordingFlag));
5656d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    picture->endRecording();
5666d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
5676d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
5686d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobabool hasContent() {
5696d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    if (!m_baseLayer)
5706d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        return false;
5716d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    return !m_baseLayer->content()->isEmpty();
572f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark}
573f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark
574908703e420f4931f74527aaeb3d5faabdd66c28aChet Haasevoid setFunctor(Functor* functor) {
575908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    delete m_glDrawFunctor;
576908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    m_glDrawFunctor = functor;
577908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}
578908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
579908703e420f4931f74527aaeb3d5faabdd66c28aChet HaaseFunctor* getFunctor() {
580908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    return m_glDrawFunctor;
581908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}
582908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
583a5e649bc4d58bf3da959deae077307c487e2a3a6George Mountvoid setVisibleRect(SkRect& visibleRect) {
584a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    m_visibleRect = visibleRect;
585a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount}
586a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount
587dea0c131566f424923425970fe5621305d136e5aJohn Reckvoid setDrawExtra(DrawExtra *extra, DrawExtras type)
588dea0c131566f424923425970fe5621305d136e5aJohn Reck{
589dea0c131566f424923425970fe5621305d136e5aJohn Reck    if (type == DrawExtrasNone)
590dea0c131566f424923425970fe5621305d136e5aJohn Reck        return;
591dea0c131566f424923425970fe5621305d136e5aJohn Reck    DrawExtra* old = m_extras[type - 1];
592dea0c131566f424923425970fe5621305d136e5aJohn Reck    m_extras[type - 1] = extra;
593dea0c131566f424923425970fe5621305d136e5aJohn Reck    if (old != extra) {
594dea0c131566f424923425970fe5621305d136e5aJohn Reck        delete old;
595dea0c131566f424923425970fe5621305d136e5aJohn Reck    }
596dea0c131566f424923425970fe5621305d136e5aJohn Reck}
597dea0c131566f424923425970fe5621305d136e5aJohn Reck
598dea0c131566f424923425970fe5621305d136e5aJohn Reckvoid setTextSelection(SelectText *selection) {
599dea0c131566f424923425970fe5621305d136e5aJohn Reck    setDrawExtra(selection, DrawExtrasSelection);
600dea0c131566f424923425970fe5621305d136e5aJohn Reck}
601dea0c131566f424923425970fe5621305d136e5aJohn Reck
6021a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiwareconst TransformationMatrix* getLayerTransform(int layerId) {
6031a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware    if (layerId != -1 && m_baseLayer) {
6041a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware        LayerAndroid* layer = m_baseLayer->findById(layerId);
6051a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware        // We need to make sure the drawTransform is up to date as this is
6061a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware        // called before a draw() or drawGL()
6071a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware        if (layer) {
6081a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware            m_baseLayer->updateLayerPositions(m_visibleRect);
6091a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware            return layer->drawTransform();
6101a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware        }
6111a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware    }
6121a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware    return 0;
6131a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware}
6141a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware
615304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mountint getHandleLayerId(SelectText::HandleId handleId, SkIPoint& cursorPoint,
616304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount        FloatQuad& textBounds) {
617dea0c131566f424923425970fe5621305d136e5aJohn Reck    SelectText* selectText = static_cast<SelectText*>(getDrawExtra(DrawExtrasSelection));
618fba5bad67c2589216f05da70a7f2fbd537637672John Reck    if (!selectText || !m_baseLayer)
619dea0c131566f424923425970fe5621305d136e5aJohn Reck        return -1;
620dea0c131566f424923425970fe5621305d136e5aJohn Reck    int layerId = selectText->caretLayerId(handleId);
621304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    IntRect cursorRect = selectText->caretRect(handleId);
622304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    IntRect textRect = selectText->textRect(handleId);
623304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    // Rects exclude the last pixel on right/bottom. We want only included pixels.
624304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    cursorPoint.set(cursorRect.x(), cursorRect.maxY() - 1);
6257f1e5ac384d6c663e2cb6b6bb7a58a300d16e1beGeorge Mount    textRect.setHeight(std::max(1, textRect.height() - 1));
6267f1e5ac384d6c663e2cb6b6bb7a58a300d16e1beGeorge Mount    textRect.setWidth(std::max(1, textRect.width() - 1));
627304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    textBounds = FloatQuad(textRect);
628304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount
6291a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware    const TransformationMatrix* transform = getLayerTransform(layerId);
6301a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware    if (transform) {
6311a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware        // We're overloading the concept of Rect to be just the two
6321a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware        // points (bottom-left and top-right.
6331a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware        cursorPoint = transform->mapPoint(cursorPoint);
6341a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware        textBounds = transform->mapQuad(textBounds);
635e5d643b22badb45c77ef040896bd8ac46edae7d0George Mount    }
636730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount    return layerId;
637730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount}
638730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount
639730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mountvoid mapLayerRect(int layerId, SkIRect& rect) {
6401a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware    const TransformationMatrix* transform = getLayerTransform(layerId);
6411a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware    if (transform)
6421a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware        transform->mapRect(rect);
643dea0c131566f424923425970fe5621305d136e5aJohn Reck}
644dea0c131566f424923425970fe5621305d136e5aJohn Reck
645304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mountvoid floatQuadToQuadF(JNIEnv* env, const FloatQuad& nativeTextQuad,
646304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount        jobject textQuad)
647304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount{
648304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    jobject p1 = env->GetObjectField(textQuad, m_javaGlue.m_quadFP1);
649304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    jobject p2 = env->GetObjectField(textQuad, m_javaGlue.m_quadFP2);
650304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    jobject p3 = env->GetObjectField(textQuad, m_javaGlue.m_quadFP3);
651304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    jobject p4 = env->GetObjectField(textQuad, m_javaGlue.m_quadFP4);
652304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    GraphicsJNI::point_to_jpointf(nativeTextQuad.p1(), env, p1);
653304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    GraphicsJNI::point_to_jpointf(nativeTextQuad.p2(), env, p2);
654304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    GraphicsJNI::point_to_jpointf(nativeTextQuad.p3(), env, p3);
655304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    GraphicsJNI::point_to_jpointf(nativeTextQuad.p4(), env, p4);
656304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    env->DeleteLocalRef(p1);
657304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    env->DeleteLocalRef(p2);
658304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    env->DeleteLocalRef(p3);
659304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    env->DeleteLocalRef(p4);
660304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount}
661304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount
662a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck// This is called when WebView switches rendering modes in a more permanent fashion
663a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck// such as when the layer type is set or the view is attached/detached from the window
664a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reckint setHwAccelerated(bool hwAccelerated) {
665a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck    if (!m_glWebViewState)
666a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck        return 0;
667885e650b12d781be054b31ae6221925a0184dc33Chris Craik    LayerAndroid* root = m_baseLayer;
668a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck    if (root)
669a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck        return root->setHwAccelerated(hwAccelerated);
670a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck    return 0;
671a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck}
672a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck
673d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck    bool m_isDrawingPaused;
6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate: // local state for WebView
6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // private to getFrameCache(); other functions operate in a different thread
6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebViewCore* m_viewImpl;
6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int m_generation; // associate unique ID with sent kit focus to match with ui
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Corresponds to the same-named boolean on the java side.
6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_heightCanMeasure;
6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int m_lastDx;
6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkMSec m_lastDxTime;
682dea0c131566f424923425970fe5621305d136e5aJohn Reck    DrawExtra* m_extras[DRAW_EXTRAS_SIZE];
6836d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    BaseLayerAndroid* m_baseLayer;
684908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    Functor* m_glDrawFunctor;
685a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
686c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger    GLWebViewState* m_glWebViewState;
687a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
688a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    SkRect m_visibleRect;
68955b4bdbd661ac94fd05ab40de08250bf242d5346John Reck    bool m_isHighEndGfx;
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; // end of WebView class
6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
692908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
693908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase/**
694908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * This class holds a function pointer and parameters for calling drawGL into a specific
695908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * viewport. The pointer to the Functor will be put on a framework display list to be called
696908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * when the display list is replayed.
697908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase */
698908703e420f4931f74527aaeb3d5faabdd66c28aChet Haaseclass GLDrawFunctor : Functor {
699908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    public:
700908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    GLDrawFunctor(WebView* _wvInstance,
701bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu            int (WebView::*_funcPtr)(WebCore::IntRect&, WebCore::IntRect*,
702bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu                    WebCore::IntRect&, int, WebCore::IntRect&, jfloat, jint, bool),
703908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase            WebCore::IntRect _viewRect, float _scale, int _extras) {
704908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        wvInstance = _wvInstance;
705908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        funcPtr = _funcPtr;
706908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        viewRect = _viewRect;
707908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        scale = _scale;
708908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        extras = _extras;
709908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    };
71079d8e0434bfe00a793e8041f96dc02ec1d98e694Romain Guy    status_t operator()(int messageId, void* data) {
711d71bb71a2be8c0f7eff98c981a5410aa49e04843Chris Craik        TRACE_METHOD();
712d71bb71a2be8c0f7eff98c981a5410aa49e04843Chris Craik
71379d8e0434bfe00a793e8041f96dc02ec1d98e694Romain Guy        if (viewRect.isEmpty()) {
714821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase            // NOOP operation if viewport is empty
715821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase            return 0;
716821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase        }
71779d8e0434bfe00a793e8041f96dc02ec1d98e694Romain Guy
7189f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard        WebCore::IntRect inval;
7199f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard        int titlebarHeight = webViewRect.height() - viewRect.height();
720b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner
721b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner        uirenderer::DrawGlInfo* info = reinterpret_cast<uirenderer::DrawGlInfo*>(data);
722be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard        WebCore::IntRect clip(info->clipLeft, info->clipTop,
723be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard                              info->clipRight - info->clipLeft,
724be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard                              info->clipBottom - info->clipTop);
725d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu
726d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu        WebCore::IntRect localViewRect = viewRect;
727d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu        if (info->isLayer) {
728d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu            // When webview is on a layer, we need to use the viewport relative
729d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu            // to the FBO, rather than the screen(which will use viewRect).
730d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu            localViewRect.setX(clip.x());
731d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu            localViewRect.setY(info->height - clip.y() - clip.height());
732d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu        }
733bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu        bool shouldDraw = (messageId == uirenderer::DrawGlInfo::kModeDraw);
734868c42d56aae84ed4cd33f9de0d93132e1483ddcTeng-Hui Zhu        // Send the necessary info to the shader.
735868c42d56aae84ed4cd33f9de0d93132e1483ddcTeng-Hui Zhu        TilesManager::instance()->shader()->setGLDrawInfo(info);
736868c42d56aae84ed4cd33f9de0d93132e1483ddcTeng-Hui Zhu
737bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu        int returnFlags = (*wvInstance.*funcPtr)(localViewRect, &inval, webViewRect,
738bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu                titlebarHeight, clip, scale, extras, shouldDraw);
739bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu        if ((returnFlags & uirenderer::DrawGlInfo::kStatusDraw) != 0) {
7409f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard            IntRect finalInval;
741bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu            if (inval.isEmpty())
7429f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard                finalInval = webViewRect;
743bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu            else {
7449f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard                finalInval.setX(webViewRect.x() + inval.x());
745be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard                finalInval.setY(webViewRect.y() + titlebarHeight + inval.y());
7469f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard                finalInval.setWidth(inval.width());
7479f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard                finalInval.setHeight(inval.height());
7489f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard            }
749d1f5cf1ad8b20860bd9cb34a483451019124d1f9Romain Guy            info->dirtyLeft = finalInval.x();
750d1f5cf1ad8b20860bd9cb34a483451019124d1f9Romain Guy            info->dirtyTop = finalInval.y();
7511ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block            info->dirtyRight = finalInval.maxX();
7521ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block            info->dirtyBottom = finalInval.maxY();
753b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy        }
754bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu        // return 1 if invalidation needed, 2 to request non-drawing functor callback, 0 otherwise
755bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu        ALOGV("returnFlags are %d, shouldDraw %d", returnFlags, shouldDraw);
756bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu        return returnFlags;
757908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    }
758908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    void updateRect(WebCore::IntRect& _viewRect) {
759908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        viewRect = _viewRect;
760908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    }
761b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy    void updateViewRect(WebCore::IntRect& _viewRect) {
762b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy        webViewRect = _viewRect;
763b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy    }
764d0a011b30b97598ee74f329aaa217a6ab733f1f1Teng-Hui Zhu    void updateScale(float _scale) {
765d0a011b30b97598ee74f329aaa217a6ab733f1f1Teng-Hui Zhu        scale = _scale;
766d0a011b30b97598ee74f329aaa217a6ab733f1f1Teng-Hui Zhu    }
767908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    private:
768908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    WebView* wvInstance;
769bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu    int (WebView::*funcPtr)(WebCore::IntRect&, WebCore::IntRect*,
770bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu            WebCore::IntRect&, int, WebCore::IntRect&, float, int, bool);
771908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    WebCore::IntRect viewRect;
772b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy    WebCore::IntRect webViewRect;
773908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    jfloat scale;
774908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    jint extras;
775908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase};
776908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Native JNI methods
7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
78155b4bdbd661ac94fd05ab40de08250bf242d5346John Reckstatic void nativeCreate(JNIEnv *env, jobject obj, int viewImpl,
78255b4bdbd661ac94fd05ab40de08250bf242d5346John Reck                         jstring drawableDir, jboolean isHighEndGfx)
7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7844de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins    WTF::String dir = jstringToWtfString(env, drawableDir);
785894aaa1bd5446eebf8169efa1998fbe6964c18d0Chris Craik    new WebView(env, obj, viewImpl, dir, isHighEndGfx);
7868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // NEED THIS OR SOMETHING LIKE IT!
7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //Release(obj);
7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
79046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic WebCore::IntRect jrect_to_webrect(JNIEnv* env, jobject obj)
79146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{
792a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    if (obj) {
793a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        int L, T, R, B;
794a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        GraphicsJNI::get_jrect(env, obj, &L, &T, &R, &B);
795a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        return WebCore::IntRect(L, T, R - L, B - T);
796a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    } else
797a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        return WebCore::IntRect();
798a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount}
799a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount
800a5e649bc4d58bf3da959deae077307c487e2a3a6George Mountstatic SkRect jrectf_to_rect(JNIEnv* env, jobject obj)
801a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount{
802a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    SkRect rect = SkRect::MakeEmpty();
803a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    if (obj)
804a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        GraphicsJNI::jrectf_to_rect(env, obj, &rect);
805a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    return rect;
80646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark}
80746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark
808a5e649bc4d58bf3da959deae077307c487e2a3a6George Mountstatic jint nativeDraw(JNIEnv *env, jobject obj, jobject canv,
809a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        jobject visible, jint color,
8106d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        jint extras, jboolean split) {
8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkCanvas* canvas = GraphicsJNI::getNativeCanvas(env, canv);
812a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    WebView* webView = GET_NATIVE_VIEW(env, obj);
813a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    SkRect visibleRect = jrectf_to_rect(env, visible);
814a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    webView->setVisibleRect(visibleRect);
815dea0c131566f424923425970fe5621305d136e5aJohn Reck    PictureSet* pictureSet = webView->draw(canvas, color,
816dea0c131566f424923425970fe5621305d136e5aJohn Reck            static_cast<WebView::DrawExtras>(extras), split);
817a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    return reinterpret_cast<jint>(pictureSet);
8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
82024b412c6f16018a2a2971eef09648ce105ef618aChris Craikstatic jint nativeCreateDrawGLFunction(JNIEnv *env, jobject obj, jint nativeView,
821223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck                                    jobject jrect, jobject jviewrect,
822a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount                                    jobject jvisiblerect,
823223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck                                    jfloat scale, jint extras) {
824a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    WebCore::IntRect viewRect = jrect_to_webrect(env, jrect);
825223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck    WebView *wvInstance = (WebView*) nativeView;
826a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    SkRect visibleRect = jrectf_to_rect(env, jvisiblerect);
827a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    wvInstance->setVisibleRect(visibleRect);
828a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount
829a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    GLDrawFunctor* functor = new GLDrawFunctor(wvInstance,
830a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount            &android::WebView::drawGL, viewRect, scale, extras);
831908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    wvInstance->setFunctor((Functor*) functor);
832b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy
833a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    WebCore::IntRect webViewRect = jrect_to_webrect(env, jviewrect);
834b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy    functor->updateViewRect(webViewRect);
835b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy
836908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    return (jint)functor;
837908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}
838908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
83924b412c6f16018a2a2971eef09648ce105ef618aChris Craikstatic jint nativeGetDrawGLFunction(JNIEnv *env, jobject obj, jint nativeView) {
84024b412c6f16018a2a2971eef09648ce105ef618aChris Craik    WebView *wvInstance = (WebView*) nativeView;
84124b412c6f16018a2a2971eef09648ce105ef618aChris Craik    if (!wvInstance)
84224b412c6f16018a2a2971eef09648ce105ef618aChris Craik        return 0;
84324b412c6f16018a2a2971eef09648ce105ef618aChris Craik
84424b412c6f16018a2a2971eef09648ce105ef618aChris Craik    return (jint) wvInstance->getFunctor();
84524b412c6f16018a2a2971eef09648ce105ef618aChris Craik}
84624b412c6f16018a2a2971eef09648ce105ef618aChris Craik
84724b412c6f16018a2a2971eef09648ce105ef618aChris Craikstatic void nativeUpdateDrawGLFunction(JNIEnv *env, jobject obj, jint nativeView, jobject jrect,
848d0a011b30b97598ee74f329aaa217a6ab733f1f1Teng-Hui Zhu        jobject jviewrect, jobject jvisiblerect, jfloat scale) {
84924b412c6f16018a2a2971eef09648ce105ef618aChris Craik    WebView *wvInstance = (WebView*) nativeView;
850a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    if (wvInstance) {
851908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        GLDrawFunctor* functor = (GLDrawFunctor*) wvInstance->getFunctor();
852a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount        if (functor) {
853a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount            WebCore::IntRect viewRect = jrect_to_webrect(env, jrect);
854908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase            functor->updateRect(viewRect);
855b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy
856a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount            SkRect visibleRect = jrectf_to_rect(env, jvisiblerect);
857a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount            wvInstance->setVisibleRect(visibleRect);
858a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount
859a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount            WebCore::IntRect webViewRect = jrect_to_webrect(env, jviewrect);
860b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy            functor->updateViewRect(webViewRect);
861d0a011b30b97598ee74f329aaa217a6ab733f1f1Teng-Hui Zhu
862d0a011b30b97598ee74f329aaa217a6ab733f1f1Teng-Hui Zhu            functor->updateScale(scale);
863908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        }
864908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase    }
865908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}
866908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase
867223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reckstatic bool nativeEvaluateLayersAnimations(JNIEnv *env, jobject obj, jint nativeView)
868797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{
869c6151a04881a67d08d91237891fbc7cb82927219John Reck    // only call in software rendering, initialize and evaluate animations
870797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#if USE(ACCELERATED_COMPOSITING)
871885e650b12d781be054b31ae6221925a0184dc33Chris Craik    BaseLayerAndroid* baseLayer = ((WebView*)nativeView)->getBaseLayer();
872885e650b12d781be054b31ae6221925a0184dc33Chris Craik    if (baseLayer) {
873885e650b12d781be054b31ae6221925a0184dc33Chris Craik        baseLayer->initAnimations();
874885e650b12d781be054b31ae6221925a0184dc33Chris Craik        return baseLayer->evaluateAnimations();
875c6151a04881a67d08d91237891fbc7cb82927219John Reck    }
876797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#endif
877797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard    return false;
878797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard}
879797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard
880246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craikstatic bool nativeSetBaseLayer(JNIEnv *env, jobject obj, jint nativeView, jint layer, jobject inval,
881246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik                               jboolean showVisualIndicator,
882246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik                               jboolean isPictureAfterFirstLayout)
883f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{
8846d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    BaseLayerAndroid* layerImpl = reinterpret_cast<BaseLayerAndroid*>(layer);
88567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    SkRegion invalRegion;
88667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    if (inval)
88767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard        invalRegion = *GraphicsJNI::getNativeRegion(env, inval);
888246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik    return ((WebView*)nativeView)->setBaseLayer(layerImpl, invalRegion, showVisualIndicator,
889246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik                                                isPictureAfterFirstLayout);
8906d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
8916d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
8924212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reckstatic BaseLayerAndroid* nativeGetBaseLayer(JNIEnv *env, jobject obj)
8934212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck{
8944212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck    return GET_NATIVE_VIEW(env, obj)->getBaseLayer();
8954212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck}
8964212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck
8976d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic void nativeReplaceBaseContent(JNIEnv *env, jobject obj, jint content)
8986d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
8996d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    PictureSet* set = reinterpret_cast<PictureSet*>(content);
9006d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    GET_NATIVE_VIEW(env, obj)->replaceBaseContent(set);
9016d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
9026d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
9036d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic void nativeCopyBaseContentToPicture(JNIEnv *env, jobject obj, jobject pict)
9046d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
9056d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    SkPicture* picture = GraphicsJNI::getNativePicture(env, pict);
9066d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    GET_NATIVE_VIEW(env, obj)->copyBaseContentToPicture(picture);
9076d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba}
9086d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba
9096d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic bool nativeHasContent(JNIEnv *env, jobject obj)
9106d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{
9116d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    return GET_NATIVE_VIEW(env, obj)->hasContent();
912f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark}
913f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark
9149092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clarkstatic jobject nativeLayerBounds(JNIEnv* env, jobject obj, jint jlayer)
9159092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark{
9169092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    SkRect r;
9179092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark#if USE(ACCELERATED_COMPOSITING)
9189092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    LayerAndroid* layer = (LayerAndroid*) jlayer;
9199092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    r = layer->bounds();
9209092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark#else
9219092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    r.setEmpty();
9229092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark#endif
9239092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    SkIRect irect;
9249092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    r.round(&irect);
9259092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    jclass rectClass = env->FindClass("android/graphics/Rect");
9269092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V");
9279092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    jobject rect = env->NewObject(rectClass, init, irect.fLeft, irect.fTop,
9289092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark        irect.fRight, irect.fBottom);
9299092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    env->DeleteLocalRef(rectClass);
9309092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    return rect;
9319092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark}
9329092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark
9338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeSetHeightCanMeasure(JNIEnv *env, jobject obj, bool measure)
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 nativeSetHeightCanMeasure");
9378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    view->setHeightCanMeasure(measure);
9388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeDestroy(JNIEnv *env, jobject obj)
9418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
943a09e7cf49f43950a799f936bf42a9912d696547bSteve Block    ALOGD("nativeDestroy view: %p", view);
9446dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(view, "view not set in nativeDestroy");
9458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete view;
9468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9488360bc9c9facd690e42379610cbbb368d3d705efCary Clarkstatic void nativeStopGL(JNIEnv *env, jobject obj)
9498360bc9c9facd690e42379610cbbb368d3d705efCary Clark{
9508360bc9c9facd690e42379610cbbb368d3d705efCary Clark    GET_NATIVE_VIEW(env, obj)->stopGL();
9518360bc9c9facd690e42379610cbbb368d3d705efCary Clark}
9528360bc9c9facd690e42379610cbbb368d3d705efCary Clark
9538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jobject nativeGetSelection(JNIEnv *env, jobject obj)
9548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, obj);
9566dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(view, "view not set in %s", __FUNCTION__);
9575e5962825729a211e093fd615ddc9e5b0bec10bdCary Clark    String selection = view->getSelection();
95879b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block    return wtfStringToJstring(env, selection);
9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
961a3a38731f4eeb01d2a42965b6c875d957999969dChris Craikstatic void nativeDiscardAllTextures(JNIEnv *env, jobject obj)
962a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik{
963a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik    //discard all textures for debugging/test purposes, but not gl backing memory
964a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik    bool allTextures = true, deleteGLTextures = false;
965a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik    TilesManager::instance()->discardTextures(allTextures, deleteGLTextures);
966af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik}
967af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik
9685dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic void nativeTileProfilingStart(JNIEnv *env, jobject obj)
9695dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
970687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    TilesManager::instance()->getProfiler()->start();
9715dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
9725dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
9735dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic float nativeTileProfilingStop(JNIEnv *env, jobject obj)
9745dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
975687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    return TilesManager::instance()->getProfiler()->stop();
9765dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
9775dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
9785dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic void nativeTileProfilingClear(JNIEnv *env, jobject obj)
9795dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
980687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    TilesManager::instance()->getProfiler()->clear();
9815dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
9825dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
9835dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic int nativeTileProfilingNumFrames(JNIEnv *env, jobject obj)
9845dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
985687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    return TilesManager::instance()->getProfiler()->numFrames();
9865dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
9875dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
9885dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic int nativeTileProfilingNumTilesInFrame(JNIEnv *env, jobject obj, int frame)
9895dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
990687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    return TilesManager::instance()->getProfiler()->numTilesInFrame(frame);
9915dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
9925dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
993687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craikstatic int nativeTileProfilingGetInt(JNIEnv *env, jobject obj, int frame, int tile, jstring jkey)
9945dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
995687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    WTF::String key = jstringToWtfString(env, jkey);
996687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    TileProfileRecord* record = TilesManager::instance()->getProfiler()->getTile(frame, tile);
997687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik
998687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    if (key == "left")
999687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        return record->left;
1000687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    if (key == "top")
1001687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        return record->top;
1002687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    if (key == "right")
1003687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        return record->right;
1004687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    if (key == "bottom")
1005687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        return record->bottom;
1006687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    if (key == "level")
1007687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        return record->level;
1008687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    if (key == "isReady")
1009687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        return record->isReady ? 1 : 0;
1010687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    return -1;
10115dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
10125dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
1013687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craikstatic float nativeTileProfilingGetFloat(JNIEnv *env, jobject obj, int frame, int tile, jstring jkey)
10145dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{
1015687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    TileProfileRecord* record = TilesManager::instance()->getProfiler()->getTile(frame, tile);
1016687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    return record->scale;
10175dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik}
10185dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik
10198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_DUMP_DISPLAY_TREE
10208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void dumpToFile(const char text[], void* file) {
10218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fwrite(text, 1, strlen(text), reinterpret_cast<FILE*>(file));
10228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fwrite("\n", 1, 1, reinterpret_cast<FILE*>(file));
10238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
10258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1026c2992cfb02b098d6e8579b6a0ba7f7a11c7753feJohn Reck// Return true to view invalidate WebView
1027f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roardstatic bool nativeSetProperty(JNIEnv *env, jobject obj, jstring jkey, jstring jvalue)
1028d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck{
1029d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck    WTF::String key = jstringToWtfString(env, jkey);
1030d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck    WTF::String value = jstringToWtfString(env, jvalue);
1031ef238925ea0ba6305e4540aff5c6953503993f3bNicolas Roard    if (key == "inverted") {
1032bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik        bool shouldInvert = (value == "true");
1033bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik        TilesManager::instance()->setInvertedScreen(shouldInvert);
1034f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard        return true;
1035d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck    }
10368852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu    else if (key == "inverted_contrast") {
1037bbb9caa2571e2c0192861a336c358412e9e7f0c7Nicolas Roard        float contrast = value.toFloat();
1038bbb9caa2571e2c0192861a336c358412e9e7f0c7Nicolas Roard        TilesManager::instance()->setInvertedScreenContrast(contrast);
1039f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard        return true;
1040bbb9caa2571e2c0192861a336c358412e9e7f0c7Nicolas Roard    }
10418852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu    else if (key == "enable_cpu_upload_path") {
10420960fe0e966317c4728542e9cfaa259523665900Teng-Hui Zhu        TilesManager::instance()->transferQueue()->setTextureUploadType(
10430960fe0e966317c4728542e9cfaa259523665900Teng-Hui Zhu            value == "true" ? CpuUpload : GpuUpload);
10440960fe0e966317c4728542e9cfaa259523665900Teng-Hui Zhu    }
10458852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu    else if (key == "use_minimal_memory") {
10468852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu        TilesManager::instance()->setUseMinimalMemory(value == "true");
10478852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu    }
1048bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik    else if (key == "use_double_buffering") {
1049bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik        TilesManager::instance()->setUseDoubleBuffering(value == "true");
1050bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik    }
1051bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik    else if (key == "tree_updates") {
1052d8be9016b7fda67a91b4ee17b3b2e7ba692ee553Chris Craik        TilesManager::instance()->clearContentUpdates();
1053bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik    }
1054f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard    return false;
1055d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck}
1056d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck
1057bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craikstatic jstring nativeGetProperty(JNIEnv *env, jobject obj, jstring jkey)
1058d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck{
1059bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik    WTF::String key = jstringToWtfString(env, jkey);
1060bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik    if (key == "tree_updates") {
1061d8be9016b7fda67a91b4ee17b3b2e7ba692ee553Chris Craik        int updates = TilesManager::instance()->getContentUpdates();
1062bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik        WTF::String wtfUpdates = WTF::String::number(updates);
1063bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik        return wtfStringToJstring(env, wtfUpdates);
1064bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik    }
1065d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck    return 0;
1066d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck}
1067d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck
106852f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reckstatic void nativeOnTrimMemory(JNIEnv *env, jobject obj, jint level)
106952f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck{
10702986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik    if (TilesManager::hardwareAccelerationEnabled()) {
1071e1dfe84b38ed080c7bb7ac00fd9e3c6c590a147dTeng-Hui Zhu        // When we got TRIM_MEMORY_MODERATE or TRIM_MEMORY_COMPLETE, we should
1072e1dfe84b38ed080c7bb7ac00fd9e3c6c590a147dTeng-Hui Zhu        // make sure the transfer queue is empty and then abandon the Surface
1073e1dfe84b38ed080c7bb7ac00fd9e3c6c590a147dTeng-Hui Zhu        // Texture to avoid ANR b/c framework may destroy the EGL context.
1074e1dfe84b38ed080c7bb7ac00fd9e3c6c590a147dTeng-Hui Zhu        // Refer to WindowManagerImpl.java for conditions we followed.
107500144be011338276839a08a66ae79b14629b268bTeng-Hui Zhu        TilesManager* tilesManager = TilesManager::instance();
1076d2339fb5509a885ab17100ead6b3a543e7d4d7f7Teng-Hui Zhu        if ((level >= TRIM_MEMORY_MODERATE
1077d2339fb5509a885ab17100ead6b3a543e7d4d7f7Teng-Hui Zhu            && !tilesManager->highEndGfx())
1078d2339fb5509a885ab17100ead6b3a543e7d4d7f7Teng-Hui Zhu            || level >= TRIM_MEMORY_COMPLETE) {
10790f1c02efd8cc889db10575dff2749d103ceeaf87Teng-Hui Zhu            ALOGD("OnTrimMemory with EGL Context %p", eglGetCurrentContext());
10802ac76fe4e18c3325c8b3bb8f9435fdc7b96c0acaTeng-Hui Zhu            tilesManager->cleanupGLResources();
1081886eb87d34570b706a0f17fa944d98870ed6a2afTeng-Hui Zhu        }
1082e1dfe84b38ed080c7bb7ac00fd9e3c6c590a147dTeng-Hui Zhu
1083a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik        bool freeAllTextures = (level > TRIM_MEMORY_UI_HIDDEN), glTextures = true;
108400144be011338276839a08a66ae79b14629b268bTeng-Hui Zhu        tilesManager->discardTextures(freeAllTextures, glTextures);
10852986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik    }
108652f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck}
108752f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck
10888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeDumpDisplayTree(JNIEnv* env, jobject jwebview, jstring jurl)
10898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_DUMP_DISPLAY_TREE
10918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView* view = GET_NATIVE_VIEW(env, jwebview);
10926dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(view, "view not set in %s", __FUNCTION__);
10938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1094bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed    if (view && view->getWebViewCore()) {
1095bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed        FILE* file = fopen(DISPLAY_TREE_LOG_FILE, "w");
1096bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed        if (file) {
1097bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            SkFormatDumper dumper(dumpToFile, file);
1098bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // dump the URL
1099bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            if (jurl) {
1100bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed                const char* str = env->GetStringUTFChars(jurl, 0);
1101bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed                SkDebugf("Dumping %s to %s\n", str, DISPLAY_TREE_LOG_FILE);
1102bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed                dumpToFile(str, file);
1103bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed                env->ReleaseStringUTFChars(jurl, str);
11048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
1105bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // now dump the display tree
1106bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            SkDumpCanvas canvas(&dumper);
1107bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // this will playback the picture into the canvas, which will
1108bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // spew its contents to the dumper
1109dea0c131566f424923425970fe5621305d136e5aJohn Reck            view->draw(&canvas, 0, WebView::DrawExtrasNone, false);
1110bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            // we're done with the file now
1111bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            fwrite("\n", 1, 1, file);
1112bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed            fclose(file);
11138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1114859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
1115885e650b12d781be054b31ae6221925a0184dc33Chris Craik        const LayerAndroid* baseLayer = view->getBaseLayer();
1116885e650b12d781be054b31ae6221925a0184dc33Chris Craik        if (baseLayer) {
1117859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard          FILE* file = fopen(LAYERS_TREE_LOG_FILE,"w");
1118859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard          if (file) {
1119885e650b12d781be054b31ae6221925a0184dc33Chris Craik              baseLayer->dumpLayers(file, 0);
1120859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard              fclose(file);
1121859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard          }
1122859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard        }
1123859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard#endif
11248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
11268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1128f81c672a4f5c06621000a6df0984cde689397d94Cary Clarkstatic int nativeScrollableLayer(JNIEnv* env, jobject jwebview, jint x, jint y,
1129f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    jobject rect, jobject bounds)
1130a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{
1131a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    WebView* view = GET_NATIVE_VIEW(env, jwebview);
11326dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(view, "view not set in %s", __FUNCTION__);
1133f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    SkIRect nativeRect, nativeBounds;
1134f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    int id = view->scrollableLayer(x, y, &nativeRect, &nativeBounds);
1135f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins    if (rect)
1136f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins        GraphicsJNI::irect_to_jrect(nativeRect, env, rect);
1137f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins    if (bounds)
1138f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins        GraphicsJNI::irect_to_jrect(nativeBounds, env, bounds);
113922e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott    return id;
1140a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott}
1141a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott
114222e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scottstatic bool nativeScrollLayer(JNIEnv* env, jobject obj, jint layerId, jint x,
114322e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott        jint y)
1144a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{
1145a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL)
1146a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    WebView* view = GET_NATIVE_VIEW(env, obj);
114770adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik    view->scrollLayer(layerId, x, y);
114870adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik
114970adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik    //TODO: the below only needed for the SW rendering path
1150885e650b12d781be054b31ae6221925a0184dc33Chris Craik    LayerAndroid* baseLayer = view->getBaseLayer();
1151885e650b12d781be054b31ae6221925a0184dc33Chris Craik    if (!baseLayer)
11528598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott        return false;
1153885e650b12d781be054b31ae6221925a0184dc33Chris Craik    LayerAndroid* layer = baseLayer->findById(layerId);
1154fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott    if (!layer || !layer->contentIsScrollable())
1155a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        return false;
1156fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott    return static_cast<ScrollableLayerAndroid*>(layer)->scrollTo(x, y);
1157a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#endif
1158a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    return false;
1159a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott}
1160a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott
1161f51a51f6ea307f4311a04aa865a42b233269540bChris Craikstatic void nativeSetIsScrolling(JNIEnv* env, jobject jwebview, jboolean isScrolling)
1162f51a51f6ea307f4311a04aa865a42b233269540bChris Craik{
1163f51a51f6ea307f4311a04aa865a42b233269540bChris Craik    WebView* view = GET_NATIVE_VIEW(env, jwebview);
11646dd76b804786ec760bb04b137a6bf017064226dcSteve Block    ALOG_ASSERT(view, "view not set in %s", __FUNCTION__);
1165f51a51f6ea307f4311a04aa865a42b233269540bChris Craik    view->setIsScrolling(isScrolling);
1166f51a51f6ea307f4311a04aa865a42b233269540bChris Craik}
1167f51a51f6ea307f4311a04aa865a42b233269540bChris Craik
1168c7e578330aece3c556ef205365c24676687223e2Derek Sollenbergerstatic void nativeUseHardwareAccelSkia(JNIEnv*, jobject, jboolean enabled)
1169c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger{
1170c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger    BaseRenderer::setCurrentRendererType(enabled ? BaseRenderer::Ganesh : BaseRenderer::Raster);
1171c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger}
1172c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger
11735e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reckstatic int nativeGetBackgroundColor(JNIEnv* env, jobject obj)
11745e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck{
11755e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck    WebView* view = GET_NATIVE_VIEW(env, obj);
11765e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck    BaseLayerAndroid* baseLayer = view->getBaseLayer();
11775e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck    if (baseLayer) {
11785e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck        WebCore::Color color = baseLayer->getBackgroundColor();
11795e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck        if (color.isValid())
11805e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck            return SkColorSetARGB(color.alpha(), color.red(),
11815e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck                                  color.green(), color.blue());
11825e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck    }
11835e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck    return SK_ColorWHITE;
11845e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck}
11855e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck
1186d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reckstatic void nativeSetPauseDrawing(JNIEnv *env, jobject obj, jint nativeView,
1187d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck                                      jboolean pause)
1188d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck{
1189d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck    ((WebView*)nativeView)->m_isDrawingPaused = pause;
1190d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck}
1191d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck
1192dea0c131566f424923425970fe5621305d136e5aJohn Reckstatic void nativeSetTextSelection(JNIEnv *env, jobject obj, jint nativeView,
1193dea0c131566f424923425970fe5621305d136e5aJohn Reck                                   jint selectionPtr)
1194dea0c131566f424923425970fe5621305d136e5aJohn Reck{
1195dea0c131566f424923425970fe5621305d136e5aJohn Reck    SelectText* selection = reinterpret_cast<SelectText*>(selectionPtr);
1196dea0c131566f424923425970fe5621305d136e5aJohn Reck    reinterpret_cast<WebView*>(nativeView)->setTextSelection(selection);
1197dea0c131566f424923425970fe5621305d136e5aJohn Reck}
1198dea0c131566f424923425970fe5621305d136e5aJohn Reck
1199dea0c131566f424923425970fe5621305d136e5aJohn Reckstatic jint nativeGetHandleLayerId(JNIEnv *env, jobject obj, jint nativeView,
1200304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount                                     jint handleIndex, jobject cursorPoint,
1201304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount                                     jobject textQuad)
1202dea0c131566f424923425970fe5621305d136e5aJohn Reck{
1203dea0c131566f424923425970fe5621305d136e5aJohn Reck    WebView* webview = reinterpret_cast<WebView*>(nativeView);
1204304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    SkIPoint nativePoint;
1205304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    FloatQuad nativeTextQuad;
1206304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    int layerId = webview->getHandleLayerId((SelectText::HandleId) handleIndex,
1207304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount            nativePoint, nativeTextQuad);
1208304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    if (cursorPoint)
1209304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount        GraphicsJNI::ipoint_to_jpoint(nativePoint, env, cursorPoint);
1210304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    if (textQuad)
1211304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount        webview->floatQuadToQuadF(env, nativeTextQuad, textQuad);
1212dea0c131566f424923425970fe5621305d136e5aJohn Reck    return layerId;
1213dea0c131566f424923425970fe5621305d136e5aJohn Reck}
1214dea0c131566f424923425970fe5621305d136e5aJohn Reck
1215dea0c131566f424923425970fe5621305d136e5aJohn Reckstatic jboolean nativeIsBaseFirst(JNIEnv *env, jobject obj, jint nativeView)
1216dea0c131566f424923425970fe5621305d136e5aJohn Reck{
1217dea0c131566f424923425970fe5621305d136e5aJohn Reck    WebView* webview = reinterpret_cast<WebView*>(nativeView);
1218dea0c131566f424923425970fe5621305d136e5aJohn Reck    SelectText* select = static_cast<SelectText*>(
1219dea0c131566f424923425970fe5621305d136e5aJohn Reck            webview->getDrawExtra(WebView::DrawExtrasSelection));
1220dea0c131566f424923425970fe5621305d136e5aJohn Reck    return select ? select->isBaseFirst() : false;
1221dea0c131566f424923425970fe5621305d136e5aJohn Reck}
1222dea0c131566f424923425970fe5621305d136e5aJohn Reck
1223730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mountstatic void nativeMapLayerRect(JNIEnv *env, jobject obj, jint nativeView,
1224730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount        jint layerId, jobject rect)
1225730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount{
1226730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount    WebView* webview = reinterpret_cast<WebView*>(nativeView);
1227730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount    SkIRect nativeRect;
1228730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount    GraphicsJNI::jrect_to_irect(env, rect, &nativeRect);
1229730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount    webview->mapLayerRect(layerId, nativeRect);
1230730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount    GraphicsJNI::irect_to_jrect(nativeRect, env, rect);
1231730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount}
1232730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount
1233a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reckstatic jint nativeSetHwAccelerated(JNIEnv *env, jobject obj, jint nativeView,
1234a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck        jboolean hwAccelerated)
1235a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck{
1236a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck    WebView* webview = reinterpret_cast<WebView*>(nativeView);
1237a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck    return webview->setHwAccelerated(hwAccelerated);
1238a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck}
1239a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck
12408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
12418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * JNI registration
12428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
12438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic JNINativeMethod gJavaWebViewMethods[] = {
124455b4bdbd661ac94fd05ab40de08250bf242d5346John Reck    { "nativeCreate", "(ILjava/lang/String;Z)V",
12458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeCreate },
12468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeDestroy", "()V",
12478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeDestroy },
1248a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount    { "nativeDraw", "(Landroid/graphics/Canvas;Landroid/graphics/RectF;IIZ)I",
12496d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeDraw },
125024b412c6f16018a2a2971eef09648ce105ef618aChris Craik    { "nativeCreateDrawGLFunction", "(ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/RectF;FI)I",
125124b412c6f16018a2a2971eef09648ce105ef618aChris Craik        (void*) nativeCreateDrawGLFunction },
125224b412c6f16018a2a2971eef09648ce105ef618aChris Craik    { "nativeGetDrawGLFunction", "(I)I",
1253908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        (void*) nativeGetDrawGLFunction },
125424b412c6f16018a2a2971eef09648ce105ef618aChris Craik    { "nativeUpdateDrawGLFunction", "(ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/RectF;F)V",
1255908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase        (void*) nativeUpdateDrawGLFunction },
125646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark    { "nativeDumpDisplayTree", "(Ljava/lang/String;)V",
125746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeDumpDisplayTree },
1258223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck    { "nativeEvaluateLayersAnimations", "(I)Z",
125987962ce00229855c098ba12cee8d5c015a835289Cary Clark        (void*) nativeEvaluateLayersAnimations },
12605e5962825729a211e093fd615ddc9e5b0bec10bdCary Clark    { "nativeGetSelection", "()Ljava/lang/String;",
126146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark        (void*) nativeGetSelection },
12629092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark    { "nativeLayerBounds", "(I)Landroid/graphics/Rect;",
12639092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark        (void*) nativeLayerBounds },
12648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { "nativeSetHeightCanMeasure", "(Z)V",
12658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (void*) nativeSetHeightCanMeasure },
1266246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik    { "nativeSetBaseLayer", "(IILandroid/graphics/Region;ZZ)Z",
12676d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeSetBaseLayer },
12684212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck    { "nativeGetBaseLayer", "()I",
12694212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck        (void*) nativeGetBaseLayer },
12706d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    { "nativeReplaceBaseContent", "(I)V",
12716d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeReplaceBaseContent },
12726d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    { "nativeCopyBaseContentToPicture", "(Landroid/graphics/Picture;)V",
12736d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeCopyBaseContentToPicture },
12746d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba    { "nativeHasContent", "()Z",
12756d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba        (void*) nativeHasContent },
1276a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik    { "nativeDiscardAllTextures", "()V",
1277a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik        (void*) nativeDiscardAllTextures },
12785dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik    { "nativeTileProfilingStart", "()V",
12795dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik        (void*) nativeTileProfilingStart },
12805dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik    { "nativeTileProfilingStop", "()F",
12815dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik        (void*) nativeTileProfilingStop },
12825dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik    { "nativeTileProfilingClear", "()V",
12835dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik        (void*) nativeTileProfilingClear },
12845dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik    { "nativeTileProfilingNumFrames", "()I",
12855dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik        (void*) nativeTileProfilingNumFrames },
12865dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik    { "nativeTileProfilingNumTilesInFrame", "(I)I",
12875dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik        (void*) nativeTileProfilingNumTilesInFrame },
1288687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    { "nativeTileProfilingGetInt", "(IILjava/lang/String;)I",
1289687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        (void*) nativeTileProfilingGetInt },
1290687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik    { "nativeTileProfilingGetFloat", "(IILjava/lang/String;)F",
1291687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik        (void*) nativeTileProfilingGetFloat },
12928360bc9c9facd690e42379610cbbb368d3d705efCary Clark    { "nativeStopGL", "()V",
12938360bc9c9facd690e42379610cbbb368d3d705efCary Clark        (void*) nativeStopGL },
1294f81c672a4f5c06621000a6df0984cde689397d94Cary Clark    { "nativeScrollableLayer", "(IILandroid/graphics/Rect;Landroid/graphics/Rect;)I",
1295a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        (void*) nativeScrollableLayer },
1296a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott    { "nativeScrollLayer", "(III)Z",
1297a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott        (void*) nativeScrollLayer },
1298f51a51f6ea307f4311a04aa865a42b233269540bChris Craik    { "nativeSetIsScrolling", "(Z)V",
1299f51a51f6ea307f4311a04aa865a42b233269540bChris Craik        (void*) nativeSetIsScrolling },
1300c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger    { "nativeUseHardwareAccelSkia", "(Z)V",
1301c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger        (void*) nativeUseHardwareAccelSkia },
13025e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck    { "nativeGetBackgroundColor", "()I",
13035e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck        (void*) nativeGetBackgroundColor },
1304f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard    { "nativeSetProperty", "(Ljava/lang/String;Ljava/lang/String;)Z",
1305d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck        (void*) nativeSetProperty },
1306d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck    { "nativeGetProperty", "(Ljava/lang/String;)Ljava/lang/String;",
1307d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck        (void*) nativeGetProperty },
130852f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck    { "nativeOnTrimMemory", "(I)V",
130952f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck        (void*) nativeOnTrimMemory },
1310d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck    { "nativeSetPauseDrawing", "(IZ)V",
1311d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck        (void*) nativeSetPauseDrawing },
1312dea0c131566f424923425970fe5621305d136e5aJohn Reck    { "nativeSetTextSelection", "(II)V",
1313dea0c131566f424923425970fe5621305d136e5aJohn Reck        (void*) nativeSetTextSelection },
1314304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount    { "nativeGetHandleLayerId", "(IILandroid/graphics/Point;Landroid/webkit/QuadF;)I",
1315dea0c131566f424923425970fe5621305d136e5aJohn Reck        (void*) nativeGetHandleLayerId },
1316dea0c131566f424923425970fe5621305d136e5aJohn Reck    { "nativeIsBaseFirst", "(I)Z",
1317dea0c131566f424923425970fe5621305d136e5aJohn Reck        (void*) nativeIsBaseFirst },
1318730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount    { "nativeMapLayerRect", "(IILandroid/graphics/Rect;)V",
1319730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount        (void*) nativeMapLayerRect },
1320a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck    { "nativeSetHwAccelerated", "(IZ)I",
1321a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck        (void*) nativeSetHwAccelerated },
13228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
13238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1324b92850e0391d674b9c4826b66105aaa3dd3eef96Steve Blockint registerWebView(JNIEnv* env)
13258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
132657ae1393d3097edada2640b40c895396b69cc919Jonathan Dixon    jclass clazz = env->FindClass("android/webkit/WebViewClassic");
132757ae1393d3097edada2640b40c895396b69cc919Jonathan Dixon    ALOG_ASSERT(clazz, "Unable to find class android/webkit/WebViewClassic");
13288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    gWebViewField = env->GetFieldID(clazz, "mNativeClass", "I");
132957ae1393d3097edada2640b40c895396b69cc919Jonathan Dixon    ALOG_ASSERT(gWebViewField, "Unable to find android/webkit/WebViewClassic.mNativeClass");
1330bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block    env->DeleteLocalRef(clazz);
13318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
133257ae1393d3097edada2640b40c895396b69cc919Jonathan Dixon    return jniRegisterNativeMethods(env, "android/webkit/WebViewClassic", gJavaWebViewMethods, NELEM(gJavaWebViewMethods));
13338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace android
1336