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