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