WebView.cpp revision 829229abf10ddf6135c682d42a291925ef0da35f
18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright 2007, The Android Open Source Project 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * * Redistributions of source code must retain the above copyright 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * * Redistributions in binary form must reproduce the above copyright 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 163298a7d84b96ade73c6b170671711a8f2792ae59Steve Block * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define LOG_TAG "webviewglue" 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2820ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "config.h" 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#include "AndroidAnimation.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "AndroidLog.h" 326d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba#include "BaseLayerAndroid.h" 33594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik#include "BaseRenderer.h" 3487962ce00229855c098ba12cee8d5c015a835289Cary Clark#include "DrawExtra.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h" 36594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik#include "GLWebViewState.h" 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsJNI.h" 38dcbb033aafed2abc472f0d88520869a6b1f1945bLeon Scroggins#include "HTMLInputElement.h" 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IntPoint.h" 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IntRect.h" 41797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#include "LayerAndroid.h" 42885e650b12d781be054b31ae6221925a0184dc33Chris Craik#include "LayerContent.h" 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Node.h" 44908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase#include "utils/Functor.h" 45d1f5cf1ad8b20860bd9cb34a483451019124d1f9Romain Guy#include "private/hwui/DrawGlInfo.h" 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformGraphicsContext.h" 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h" 48fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott#include "ScrollableLayerAndroid.h" 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SelectText.h" 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkCanvas.h" 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkDumpCanvas.h" 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkPicture.h" 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkRect.h" 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkTime.h" 55a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "TilesManager.h" 56594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik#include "TransferQueue.h" 5720ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "WebCoreJni.h" 580b84ecf50c01e0fbf7307ca7cae55ab3043c75a3Elliott Slaughter#include "WebRequestContext.h" 5920ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "WebViewCore.h" 6020ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include "android_graphics.h" 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef GET_NATIVE_VIEW 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#undef GET_NATIVE_VIEW 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define GET_NATIVE_VIEW(env, obj) ((WebView*)env->GetIntField(obj, gWebViewField)) 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6820ab751acc0d49d74648373f701f3d0c4ff187c0Steve Block#include <JNIUtility.h> 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <JNIHelp.h> 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <jni.h> 7177e73dcd79e53291251ce5e67ba55ce911bb07f6Mathias Agopian#include <androidfw/KeycodeLabels.h> 72dd7ee22af4f03672fa823324323466054f19a054Iain Merrick#include <wtf/text/AtomicString.h> 7379768700a853c40c66ff0b0591957958667fdd9eSteve Block#include <wtf/text/CString.h> 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7552f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck// Free as much as we possible can 7652f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck#define TRIM_MEMORY_COMPLETE 80 7752f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck// Free a lot (all textures gone) 7852f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck#define TRIM_MEMORY_MODERATE 60 7952f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck// More moderate free (keep bare minimum to restore quickly-ish - possibly clear all textures) 8052f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck#define TRIM_MEMORY_BACKGROUND 40 8152f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck// Moderate free (clear cached tiles, keep visible ones) 8252f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck#define TRIM_MEMORY_UI_HIDDEN 20 83b31c03a968a578cc43e606ede80cefcd07e8ee07John Reck// Duration to show the pressed cursor ring 84b31c03a968a578cc43e606ede80cefcd07e8ee07John Reck#define PRESSED_STATE_DURATION 400 8552f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace android { 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jfieldID gWebViewField; 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//------------------------------------- 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jmethodID GetJMethod(JNIEnv* env, jclass clazz, const char name[], const char signature[]) 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m = env->GetMethodID(clazz, name, signature); 956dd76b804786ec760bb04b137a6bf017064226dcSteve Block ALOG_ASSERT(m, "Could not find method %s", name); 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m; 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//------------------------------------- 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This class provides JNI for making calls into native code from the UI side 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// of the multi-threaded WebView. 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass WebView 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic: 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectenum FrameCachePermission { 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DontAllowNewer, 107f92d7cf56380e421b81212d32a557bda707a9555Steve Block AllowNewer 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11066c40fc863939bd103a5256eb48e944508725c53Victoria Lease#define DRAW_EXTRAS_SIZE 2 11187962ce00229855c098ba12cee8d5c015a835289Cary Clarkenum DrawExtras { // keep this in sync with WebView.java 11287962ce00229855c098ba12cee8d5c015a835289Cary Clark DrawExtrasNone = 0, 11366c40fc863939bd103a5256eb48e944508725c53Victoria Lease DrawExtrasSelection = 1, 11466c40fc863939bd103a5256eb48e944508725c53Victoria Lease DrawExtrasCursorRing = 2 11587962ce00229855c098ba12cee8d5c015a835289Cary Clark}; 11687962ce00229855c098ba12cee8d5c015a835289Cary Clark 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct JavaGlue { 1183bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott jweak m_obj; 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_scrollBy; 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_getScaledMaxXScroll; 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_getScaledMaxYScroll; 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_getVisibleRect; 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_viewInvalidate; 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_viewInvalidateRect; 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_postInvalidateDelayed; 12696eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik jmethodID m_pageSwapCallback; 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jfieldID m_rectLeft; 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jfieldID m_rectTop; 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_rectWidth; 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jmethodID m_rectHeight; 131304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount jfieldID m_quadFP1; 132304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount jfieldID m_quadFP2; 133304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount jfieldID m_quadFP3; 134304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount jfieldID m_quadFP4; 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project AutoJObject object(JNIEnv* env) { 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return getRealObject(env, m_obj); 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} m_javaGlue; 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14055b4bdbd661ac94fd05ab40de08250bf242d5346John ReckWebView(JNIEnv* env, jobject javaWebView, int viewImpl, WTF::String drawableDir, 14139b886463564843ebfd0557dd12b07bf38cb6d83John Reck bool isHighEndGfx) 14239b886463564843ebfd0557dd12b07bf38cb6d83John Reck : m_isHighEndGfx(isHighEndGfx) 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 144dea0c131566f424923425970fe5621305d136e5aJohn Reck memset(m_extras, 0, DRAW_EXTRAS_SIZE * sizeof(DrawExtra*)); 14557ae1393d3097edada2640b40c895396b69cc919Jonathan Dixon jclass clazz = env->FindClass("android/webkit/WebViewClassic"); 1463bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott m_javaGlue.m_obj = env->NewWeakGlobalRef(javaWebView); 14751c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins m_javaGlue.m_scrollBy = GetJMethod(env, clazz, "setContentScrollBy", "(IIZ)Z"); 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_javaGlue.m_getScaledMaxXScroll = GetJMethod(env, clazz, "getScaledMaxXScroll", "()I"); 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_javaGlue.m_getScaledMaxYScroll = GetJMethod(env, clazz, "getScaledMaxYScroll", "()I"); 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_javaGlue.m_getVisibleRect = GetJMethod(env, clazz, "sendOurVisibleRect", "()Landroid/graphics/Rect;"); 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_javaGlue.m_viewInvalidate = GetJMethod(env, clazz, "viewInvalidate", "()V"); 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_javaGlue.m_viewInvalidateRect = GetJMethod(env, clazz, "viewInvalidate", "(IIII)V"); 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_javaGlue.m_postInvalidateDelayed = GetJMethod(env, clazz, 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project "viewInvalidateDelayed", "(JIIII)V"); 155aeca53d3fee2e94ce013c1dc12648f0335284fbbChris Craik m_javaGlue.m_pageSwapCallback = GetJMethod(env, clazz, "pageSwapCallback", "(Z)V"); 156bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block env->DeleteLocalRef(clazz); 157bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jclass rectClass = env->FindClass("android/graphics/Rect"); 1596dd76b804786ec760bb04b137a6bf017064226dcSteve Block ALOG_ASSERT(rectClass, "Could not find Rect class"); 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_javaGlue.m_rectLeft = env->GetFieldID(rectClass, "left", "I"); 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_javaGlue.m_rectTop = env->GetFieldID(rectClass, "top", "I"); 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_javaGlue.m_rectWidth = GetJMethod(env, rectClass, "width", "()I"); 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_javaGlue.m_rectHeight = GetJMethod(env, rectClass, "height", "()I"); 164bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block env->DeleteLocalRef(rectClass); 165bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block 166304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount jclass quadFClass = env->FindClass("android/webkit/QuadF"); 167304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount ALOG_ASSERT(quadFClass, "Could not find QuadF class"); 168304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount m_javaGlue.m_quadFP1 = env->GetFieldID(quadFClass, "p1", "Landroid/graphics/PointF;"); 169304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount m_javaGlue.m_quadFP2 = env->GetFieldID(quadFClass, "p2", "Landroid/graphics/PointF;"); 170304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount m_javaGlue.m_quadFP3 = env->GetFieldID(quadFClass, "p3", "Landroid/graphics/PointF;"); 171304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount m_javaGlue.m_quadFP4 = env->GetFieldID(quadFClass, "p4", "Landroid/graphics/PointF;"); 172304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount env->DeleteLocalRef(quadFClass); 173304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project env->SetIntField(javaWebView, gWebViewField, (jint)this); 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_viewImpl = (WebViewCore*) viewImpl; 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_generation = 0; 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_heightCanMeasure = false; 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_lastDx = 0; 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_lastDxTime = 0; 1806d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba m_baseLayer = 0; 181908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase m_glDrawFunctor = 0; 182d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck m_isDrawingPaused = false; 183c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger#if USE(ACCELERATED_COMPOSITING) 184c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger m_glWebViewState = 0; 185c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger#endif 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project~WebView() 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_javaGlue.m_obj) 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 1933bce2a57ea5b637c5c69fb036f59b291750e4d91Patrick Scott env->DeleteWeakGlobalRef(m_javaGlue.m_obj); 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_javaGlue.m_obj = 0; 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 19675394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roard#if USE(ACCELERATED_COMPOSITING) 197c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger // We must remove the m_glWebViewState prior to deleting m_baseLayer. If we 198c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger // do not remove it here, we risk having BaseTiles trying to paint using a 199c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger // deallocated base layer. 2008360bc9c9facd690e42379610cbbb368d3d705efCary Clark stopGL(); 20175394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roard#endif 202b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger SkSafeUnref(m_baseLayer); 203908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase delete m_glDrawFunctor; 204dea0c131566f424923425970fe5621305d136e5aJohn Reck for (int i = 0; i < DRAW_EXTRAS_SIZE; i++) 205dea0c131566f424923425970fe5621305d136e5aJohn Reck delete m_extras[i]; 206dea0c131566f424923425970fe5621305d136e5aJohn Reck} 207dea0c131566f424923425970fe5621305d136e5aJohn Reck 208dea0c131566f424923425970fe5621305d136e5aJohn ReckDrawExtra* getDrawExtra(DrawExtras extras) 209dea0c131566f424923425970fe5621305d136e5aJohn Reck{ 210dea0c131566f424923425970fe5621305d136e5aJohn Reck if (extras == DrawExtrasNone) 211dea0c131566f424923425970fe5621305d136e5aJohn Reck return 0; 212dea0c131566f424923425970fe5621305d136e5aJohn Reck return m_extras[extras - 1]; 213dea0c131566f424923425970fe5621305d136e5aJohn Reck} 214dea0c131566f424923425970fe5621305d136e5aJohn Reck 2158360bc9c9facd690e42379610cbbb368d3d705efCary Clarkvoid stopGL() 2168360bc9c9facd690e42379610cbbb368d3d705efCary Clark{ 2178360bc9c9facd690e42379610cbbb368d3d705efCary Clark#if USE(ACCELERATED_COMPOSITING) 2188360bc9c9facd690e42379610cbbb368d3d705efCary Clark delete m_glWebViewState; 2198360bc9c9facd690e42379610cbbb368d3d705efCary Clark m_glWebViewState = 0; 2208360bc9c9facd690e42379610cbbb368d3d705efCary Clark#endif 2218360bc9c9facd690e42379610cbbb368d3d705efCary Clark} 2228360bc9c9facd690e42379610cbbb368d3d705efCary Clark 223bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike ReedWebViewCore* getWebViewCore() const { 224bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed return m_viewImpl; 225bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed} 226bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed 227afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clarkvoid scrollRectOnScreen(const IntRect& rect) 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 229afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark if (rect.isEmpty()) 230afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark return; 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int dx = 0; 232afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark int left = rect.x(); 2331ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block int right = rect.maxX(); 234a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount if (left < m_visibleRect.fLeft) 235a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount dx = left - m_visibleRect.fLeft; 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Only scroll right if the entire width can fit on screen. 237a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount else if (right > m_visibleRect.fRight 238a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount && right - left < m_visibleRect.width()) 239a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount dx = right - m_visibleRect.fRight; 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int dy = 0; 241afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark int top = rect.y(); 2421ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block int bottom = rect.maxY(); 243a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount if (top < m_visibleRect.fTop) 244a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount dy = top - m_visibleRect.fTop; 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Only scroll down if the entire height can fit on screen 246a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount else if (bottom > m_visibleRect.fBottom 247a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount && bottom - top < m_visibleRect.height()) 248a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount dy = bottom - m_visibleRect.fBottom; 24951c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins if ((dx|dy) == 0 || !scrollBy(dx, dy)) 250afa40c89b27e6edbc28a5ad400eb8bb9176a88a8Cary Clark return; 25151c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins viewInvalidate(); 252e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins} 253e3635bdd4530eeff44657cb1423a0572482381ceLeon Scroggins 254bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhuint drawGL(WebCore::IntRect& viewRect, WebCore::IntRect* invalRect, 255a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount WebCore::IntRect& webViewRect, int titleBarHeight, 256bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu WebCore::IntRect& clip, float scale, int extras, bool shouldDraw) 257a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 258a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING) 259beeb8cbb217cca6094affa12a630bd75938909c9George Mount if (!m_baseLayer) 260bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu return 0; 261a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 262e47399f767707497dfc68fc64b14621a8ca9959fTeng-Hui Zhu if (!m_glWebViewState) { 263e1dfe84b38ed080c7bb7ac00fd9e3c6c590a147dTeng-Hui Zhu TilesManager::instance()->setHighEndGfx(m_isHighEndGfx); 26482ccbd8ce95211b4b5afad6a653462fd3beb771bJohn Reck m_glWebViewState = new GLWebViewState(); 265885e650b12d781be054b31ae6221925a0184dc33Chris Craik m_glWebViewState->setBaseLayer(m_baseLayer, false, true); 266e47399f767707497dfc68fc64b14621a8ca9959fTeng-Hui Zhu } 267c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger 26839b886463564843ebfd0557dd12b07bf38cb6d83John Reck DrawExtra* extra = getDrawExtra((DrawExtras) extras); 269a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 270fcb01cd64de0a1d6f8f8c897d16cc2628be53960John Reck m_glWebViewState->glExtras()->setDrawExtra(extra); 2710ca8045217bb9b308ddb407d7a9ce17d92d9f9fbNicolas Roard 272d68563709fdf68c90c730155149f6149b084730aJohn Reck // Make sure we have valid coordinates. We might not have valid coords 273d68563709fdf68c90c730155149f6149b084730aJohn Reck // if the zoom manager is still initializing. We will be redrawn 274d68563709fdf68c90c730155149f6149b084730aJohn Reck // once the correct scale is set 2752857538e8cd8c752b06ee75dd039791a186455b3Derek Sollenberger if (!m_visibleRect.isFinite()) 276bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu return 0; 277aeca53d3fee2e94ce013c1dc12648f0335284fbbChris Craik bool treesSwapped = false; 278aeca53d3fee2e94ce013c1dc12648f0335284fbbChris Craik bool newTreeHasAnim = false; 279bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu int ret = m_glWebViewState->drawGL(viewRect, m_visibleRect, invalRect, 28096eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik webViewRect, titleBarHeight, clip, scale, 281bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu &treesSwapped, &newTreeHasAnim, shouldDraw); 282246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik if (treesSwapped) { 2836dd76b804786ec760bb04b137a6bf017064226dcSteve Block ALOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!"); 28496eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik JNIEnv* env = JSC::Bindings::getJNIEnv(); 28596eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik AutoJObject javaObject = m_javaGlue.object(env); 28696eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik if (javaObject.get()) { 287aeca53d3fee2e94ce013c1dc12648f0335284fbbChris Craik env->CallVoidMethod(javaObject.get(), m_javaGlue.m_pageSwapCallback, newTreeHasAnim); 28896eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik checkException(env); 28996eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik } 29096eef4d75f8a709cc252a69c4e8cb5bd4251187eChris Craik } 291bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu return m_isDrawingPaused ? 0 : ret; 292a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif 293bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu return 0; 294a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 295a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 296dea0c131566f424923425970fe5621305d136e5aJohn ReckPictureSet* draw(SkCanvas* canvas, SkColor bgColor, DrawExtras extras, bool split) 29787962ce00229855c098ba12cee8d5c015a835289Cary Clark{ 2986d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba PictureSet* ret = 0; 2996d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba if (!m_baseLayer) { 3006d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba canvas->drawColor(bgColor); 3016d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return ret; 3026d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba } 3036d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba 3046d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba // draw the content of the base layer first 305b3f4d3af0b06dc168453641e249d0cb9eec9b570Nicolas Roard LayerContent* content = m_baseLayer->content(); 3066d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba int sc = canvas->save(SkCanvas::kClip_SaveFlag); 307829229abf10ddf6135c682d42a291925ef0da35fTeng-Hui Zhu int contentWidth = 0; 308829229abf10ddf6135c682d42a291925ef0da35fTeng-Hui Zhu int contentHeight = 0; 309829229abf10ddf6135c682d42a291925ef0da35fTeng-Hui Zhu if (content) { 310829229abf10ddf6135c682d42a291925ef0da35fTeng-Hui Zhu contentWidth = content->width(); 311829229abf10ddf6135c682d42a291925ef0da35fTeng-Hui Zhu contentHeight = content->height(); 312829229abf10ddf6135c682d42a291925ef0da35fTeng-Hui Zhu } 313829229abf10ddf6135c682d42a291925ef0da35fTeng-Hui Zhu canvas->clipRect(SkRect::MakeLTRB(0, 0, contentWidth, contentHeight), 314829229abf10ddf6135c682d42a291925ef0da35fTeng-Hui Zhu SkRegion::kDifference_Op); 31575fc360d144b97f5e50bedf7ed3222898cc56446Chris Craik Color c = m_baseLayer->getBackgroundColor(); 31675fc360d144b97f5e50bedf7ed3222898cc56446Chris Craik canvas->drawColor(SkColorSetARGBInline(c.alpha(), c.red(), c.green(), c.blue())); 3176d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba canvas->restoreToCount(sc); 3186d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba 319885e650b12d781be054b31ae6221925a0184dc33Chris Craik // call this to be sure we've adjusted for any scrolling or animations 320885e650b12d781be054b31ae6221925a0184dc33Chris Craik // before we actually draw 321885e650b12d781be054b31ae6221925a0184dc33Chris Craik m_baseLayer->updateLayerPositions(m_visibleRect); 322885e650b12d781be054b31ae6221925a0184dc33Chris Craik m_baseLayer->updatePositions(); 323885e650b12d781be054b31ae6221925a0184dc33Chris Craik 324885e650b12d781be054b31ae6221925a0184dc33Chris Craik // We have to set the canvas' matrix on the base layer 325885e650b12d781be054b31ae6221925a0184dc33Chris Craik // (to have fixed layers work as intended) 326885e650b12d781be054b31ae6221925a0184dc33Chris Craik SkAutoCanvasRestore restore(canvas, true); 327885e650b12d781be054b31ae6221925a0184dc33Chris Craik m_baseLayer->setMatrix(canvas->getTotalMatrix()); 328885e650b12d781be054b31ae6221925a0184dc33Chris Craik canvas->resetMatrix(); 329885e650b12d781be054b31ae6221925a0184dc33Chris Craik m_baseLayer->draw(canvas, getDrawExtra(extras)); 330dea0c131566f424923425970fe5621305d136e5aJohn Reck 3316d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return ret; 3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint getScaledMaxXScroll() 3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3366dd76b804786ec760bb04b137a6bf017064226dcSteve Block ALOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!"); 3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 338b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 339b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 340b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return 0; 341b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block int result = env->CallIntMethod(javaObject.get(), m_javaGlue.m_getScaledMaxXScroll); 3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint getScaledMaxYScroll() 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3486dd76b804786ec760bb04b137a6bf017064226dcSteve Block ALOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!"); 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 350b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 351b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 352b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return 0; 353b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block int result = env->CallIntMethod(javaObject.get(), m_javaGlue.m_getScaledMaxYScroll); 3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 358af03a3d6830584ef606be2d1c64845815dadb146Cary ClarkIntRect getVisibleRect() 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 360af03a3d6830584ef606be2d1c64845815dadb146Cary Clark IntRect rect; 3616dd76b804786ec760bb04b137a6bf017064226dcSteve Block ALOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!"); 3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 363b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 364b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 365b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return rect; 366b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block jobject jRect = env->CallObjectMethod(javaObject.get(), m_javaGlue.m_getVisibleRect); 3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 368af03a3d6830584ef606be2d1c64845815dadb146Cary Clark rect.setX(env->GetIntField(jRect, m_javaGlue.m_rectLeft)); 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 370af03a3d6830584ef606be2d1c64845815dadb146Cary Clark rect.setY(env->GetIntField(jRect, m_javaGlue.m_rectTop)); 3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 372af03a3d6830584ef606be2d1c64845815dadb146Cary Clark rect.setWidth(env->CallIntMethod(jRect, m_javaGlue.m_rectWidth)); 3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 374af03a3d6830584ef606be2d1c64845815dadb146Cary Clark rect.setHeight(env->CallIntMethod(jRect, m_javaGlue.m_rectHeight)); 3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project env->DeleteLocalRef(jRect); 3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 378af03a3d6830584ef606be2d1c64845815dadb146Cary Clark return rect; 3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 38182f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if USE(ACCELERATED_COMPOSITING) 382f81c672a4f5c06621000a6df0984cde689397d94Cary Clarkstatic const ScrollableLayerAndroid* findScrollableLayer( 383f81c672a4f5c06621000a6df0984cde689397d94Cary Clark const LayerAndroid* parent, int x, int y, SkIRect* foundBounds) { 38482f247bdbb98dd80c44209d87692c650c3704617Patrick Scott SkRect bounds; 38582f247bdbb98dd80c44209d87692c650c3704617Patrick Scott parent->bounds(&bounds); 38682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott // Check the parent bounds first; this will clip to within a masking layer's 38782f247bdbb98dd80c44209d87692c650c3704617Patrick Scott // bounds. 388fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott if (parent->masksToBounds() && !bounds.contains(x, y)) 38982f247bdbb98dd80c44209d87692c650c3704617Patrick Scott return 0; 39082f247bdbb98dd80c44209d87692c650c3704617Patrick Scott // Move the hit test local to parent. 39182f247bdbb98dd80c44209d87692c650c3704617Patrick Scott x -= bounds.fLeft; 39282f247bdbb98dd80c44209d87692c650c3704617Patrick Scott y -= bounds.fTop; 39382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott int count = parent->countChildren(); 3941a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott while (count--) { 3951a8ec29fc0211a6b5c53a8cd9ce20be5e630b005Patrick Scott const LayerAndroid* child = parent->getChild(count); 396f81c672a4f5c06621000a6df0984cde689397d94Cary Clark const ScrollableLayerAndroid* result = findScrollableLayer(child, x, y, 397f81c672a4f5c06621000a6df0984cde689397d94Cary Clark foundBounds); 398f81c672a4f5c06621000a6df0984cde689397d94Cary Clark if (result) { 399f81c672a4f5c06621000a6df0984cde689397d94Cary Clark foundBounds->offset(bounds.fLeft, bounds.fTop); 400f81c672a4f5c06621000a6df0984cde689397d94Cary Clark if (parent->masksToBounds()) { 401f81c672a4f5c06621000a6df0984cde689397d94Cary Clark if (bounds.width() < foundBounds->width()) 402f81c672a4f5c06621000a6df0984cde689397d94Cary Clark foundBounds->fRight = foundBounds->fLeft + bounds.width(); 403f81c672a4f5c06621000a6df0984cde689397d94Cary Clark if (bounds.height() < foundBounds->height()) 404f81c672a4f5c06621000a6df0984cde689397d94Cary Clark foundBounds->fBottom = foundBounds->fTop + bounds.height(); 405f81c672a4f5c06621000a6df0984cde689397d94Cary Clark } 40682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott return result; 407f81c672a4f5c06621000a6df0984cde689397d94Cary Clark } 40882f247bdbb98dd80c44209d87692c650c3704617Patrick Scott } 409f81c672a4f5c06621000a6df0984cde689397d94Cary Clark if (parent->contentIsScrollable()) { 410f81c672a4f5c06621000a6df0984cde689397d94Cary Clark foundBounds->set(0, 0, bounds.width(), bounds.height()); 411fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott return static_cast<const ScrollableLayerAndroid*>(parent); 412f81c672a4f5c06621000a6df0984cde689397d94Cary Clark } 41382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott return 0; 41482f247bdbb98dd80c44209d87692c650c3704617Patrick Scott} 41582f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif 41682f247bdbb98dd80c44209d87692c650c3704617Patrick Scott 417f81c672a4f5c06621000a6df0984cde689397d94Cary Clarkint scrollableLayer(int x, int y, SkIRect* layerRect, SkIRect* bounds) 418a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{ 41982f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if USE(ACCELERATED_COMPOSITING) 420885e650b12d781be054b31ae6221925a0184dc33Chris Craik if (!m_baseLayer) 421a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott return 0; 422885e650b12d781be054b31ae6221925a0184dc33Chris Craik const ScrollableLayerAndroid* result = findScrollableLayer(m_baseLayer, x, y, bounds); 42322e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott if (result) { 42422e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott result->getScrollRect(layerRect); 4258598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott return result->uniqueId(); 42622e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott } 427a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#endif 428a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott return 0; 429a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott} 430a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott 43170adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craikvoid scrollLayer(int layerId, int x, int y) 43270adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik{ 43370adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik if (m_glWebViewState) 43470adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik m_glWebViewState->scrollLayer(layerId, x, y); 43570adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik} 43670adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik 4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid setHeightCanMeasure(bool measure) 4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_heightCanMeasure = measure; 4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 44287962ce00229855c098ba12cee8d5c015a835289Cary ClarkString getSelection() 4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 444dea0c131566f424923425970fe5621305d136e5aJohn Reck SelectText* select = static_cast<SelectText*>( 445dea0c131566f424923425970fe5621305d136e5aJohn Reck getDrawExtra(WebView::DrawExtrasSelection)); 446dea0c131566f424923425970fe5621305d136e5aJohn Reck if (select) 447dea0c131566f424923425970fe5621305d136e5aJohn Reck return select->getText(); 448dea0c131566f424923425970fe5621305d136e5aJohn Reck return String(); 4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 45151c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scrogginsbool scrollBy(int dx, int dy) 4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4536dd76b804786ec760bb04b137a6bf017064226dcSteve Block ALOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!"); 4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 456b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 457b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 458b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return false; 459b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block bool result = env->CallBooleanMethod(javaObject.get(), m_javaGlue.m_scrollBy, dx, dy, true); 4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 46151c0d4c6b1b74fff7336d81451ba7d2fc132e31cLeon Scroggins return result; 4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 464f51a51f6ea307f4311a04aa865a42b233269540bChris Craikvoid setIsScrolling(bool isScrolling) 465f51a51f6ea307f4311a04aa865a42b233269540bChris Craik{ 466ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch#if USE(ACCELERATED_COMPOSITING) 467ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch if (m_glWebViewState) 468ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch m_glWebViewState->setIsScrolling(isScrolling); 469ec7cadd6477635dceb9ef29175fbb0bc55659462Ben Murdoch#endif 470f51a51f6ea307f4311a04aa865a42b233269540bChris Craik} 471f51a51f6ea307f4311a04aa865a42b233269540bChris Craik 4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid viewInvalidate() 4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 475b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 476b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 477b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return; 478b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block env->CallVoidMethod(javaObject.get(), m_javaGlue.m_viewInvalidate); 4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid viewInvalidateRect(int l, int t, int r, int b) 4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 485b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 486b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 487b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return; 488b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block env->CallVoidMethod(javaObject.get(), m_javaGlue.m_viewInvalidateRect, l, r, t, b); 4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid postInvalidateDelayed(int64_t delay, const WebCore::IntRect& bounds) 4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JNIEnv* env = JSC::Bindings::getJNIEnv(); 495b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block AutoJObject javaObject = m_javaGlue.object(env); 496b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block if (!javaObject.get()) 497b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block return; 498b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block env->CallVoidMethod(javaObject.get(), m_javaGlue.m_postInvalidateDelayed, 4991ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block delay, bounds.x(), bounds.y(), bounds.maxX(), bounds.maxY()); 5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkException(env); 5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 50382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL) 504a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scottstatic void copyScrollPositionRecursive(const LayerAndroid* from, 505a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott LayerAndroid* root) 506a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{ 507a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott if (!from || !root) 508a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott return; 509a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott for (int i = 0; i < from->countChildren(); i++) { 510a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott const LayerAndroid* l = from->getChild(i); 511a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott if (l->contentIsScrollable()) { 51282f247bdbb98dd80c44209d87692c650c3704617Patrick Scott const SkPoint& pos = l->getPosition(); 51382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott LayerAndroid* match = root->findById(l->uniqueId()); 51482f247bdbb98dd80c44209d87692c650c3704617Patrick Scott if (match && match->contentIsScrollable()) 51582f247bdbb98dd80c44209d87692c650c3704617Patrick Scott match->setPosition(pos.fX, pos.fY); 516a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott } 517a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott copyScrollPositionRecursive(l, root); 518a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott } 519a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott} 52082f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif 521a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott 522885e650b12d781be054b31ae6221925a0184dc33Chris CraikBaseLayerAndroid* getBaseLayer() const { return m_baseLayer; } 523885e650b12d781be054b31ae6221925a0184dc33Chris Craik 524885e650b12d781be054b31ae6221925a0184dc33Chris Craikbool setBaseLayer(BaseLayerAndroid* newBaseLayer, SkRegion& inval, bool showVisualIndicator, 525246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik bool isPictureAfterFirstLayout) 526f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{ 527246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik bool queueFull = false; 528a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING) 529246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik if (m_glWebViewState) { 530885e650b12d781be054b31ae6221925a0184dc33Chris Craik // TODO: mark as inval on webkit side 531885e650b12d781be054b31ae6221925a0184dc33Chris Craik if (newBaseLayer) 532885e650b12d781be054b31ae6221925a0184dc33Chris Craik newBaseLayer->markAsDirty(inval); 533885e650b12d781be054b31ae6221925a0184dc33Chris Craik queueFull = m_glWebViewState->setBaseLayer(newBaseLayer, showVisualIndicator, 534246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik isPictureAfterFirstLayout); 535246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik } 536a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif 537a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 53882f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL) 539885e650b12d781be054b31ae6221925a0184dc33Chris Craik if (newBaseLayer) { 540885e650b12d781be054b31ae6221925a0184dc33Chris Craik // TODO: the below tree position copies are only necessary in software rendering 541885e650b12d781be054b31ae6221925a0184dc33Chris Craik copyScrollPositionRecursive(m_baseLayer, newBaseLayer); 542cf6e10e145f44cab3eb70f3782b51a92cf61ae7dShimeng (Simon) Wang } 54382f247bdbb98dd80c44209d87692c650c3704617Patrick Scott#endif 544b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger SkSafeUnref(m_baseLayer); 545885e650b12d781be054b31ae6221925a0184dc33Chris Craik m_baseLayer = newBaseLayer; 546246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik 547246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik return queueFull; 5486d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba} 5496d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba 5506d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobavoid replaceBaseContent(PictureSet* set) 5516d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{ 5526d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba if (!m_baseLayer) 5536d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return; 554b3f4d3af0b06dc168453641e249d0cb9eec9b570Nicolas Roard // TODO: remove the split picture codepath 5556d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba delete set; 5566d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba} 5576d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba 5586d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobavoid copyBaseContentToPicture(SkPicture* picture) 5596d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{ 5606d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba if (!m_baseLayer) 5616d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return; 562b3f4d3af0b06dc168453641e249d0cb9eec9b570Nicolas Roard LayerContent* content = m_baseLayer->content(); 563885e650b12d781be054b31ae6221925a0184dc33Chris Craik content->draw(picture->beginRecording(content->width(), content->height(), 564885e650b12d781be054b31ae6221925a0184dc33Chris Craik SkPicture::kUsePathBoundsForClip_RecordingFlag)); 5656d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba picture->endRecording(); 5666d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba} 5676d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba 5686d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobabool hasContent() { 5696d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba if (!m_baseLayer) 5706d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return false; 5716d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return !m_baseLayer->content()->isEmpty(); 572f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark} 573f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark 574908703e420f4931f74527aaeb3d5faabdd66c28aChet Haasevoid setFunctor(Functor* functor) { 575908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase delete m_glDrawFunctor; 576908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase m_glDrawFunctor = functor; 577908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase} 578908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase 579908703e420f4931f74527aaeb3d5faabdd66c28aChet HaaseFunctor* getFunctor() { 580908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase return m_glDrawFunctor; 581908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase} 582908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase 583a5e649bc4d58bf3da959deae077307c487e2a3a6George Mountvoid setVisibleRect(SkRect& visibleRect) { 584a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount m_visibleRect = visibleRect; 585a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount} 586a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount 587dea0c131566f424923425970fe5621305d136e5aJohn Reckvoid setDrawExtra(DrawExtra *extra, DrawExtras type) 588dea0c131566f424923425970fe5621305d136e5aJohn Reck{ 589dea0c131566f424923425970fe5621305d136e5aJohn Reck if (type == DrawExtrasNone) 590dea0c131566f424923425970fe5621305d136e5aJohn Reck return; 591dea0c131566f424923425970fe5621305d136e5aJohn Reck DrawExtra* old = m_extras[type - 1]; 592dea0c131566f424923425970fe5621305d136e5aJohn Reck m_extras[type - 1] = extra; 593dea0c131566f424923425970fe5621305d136e5aJohn Reck if (old != extra) { 594dea0c131566f424923425970fe5621305d136e5aJohn Reck delete old; 595dea0c131566f424923425970fe5621305d136e5aJohn Reck } 596dea0c131566f424923425970fe5621305d136e5aJohn Reck} 597dea0c131566f424923425970fe5621305d136e5aJohn Reck 598dea0c131566f424923425970fe5621305d136e5aJohn Reckvoid setTextSelection(SelectText *selection) { 599dea0c131566f424923425970fe5621305d136e5aJohn Reck setDrawExtra(selection, DrawExtrasSelection); 600dea0c131566f424923425970fe5621305d136e5aJohn Reck} 601dea0c131566f424923425970fe5621305d136e5aJohn Reck 6021a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiwareconst TransformationMatrix* getLayerTransform(int layerId) { 6031a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware if (layerId != -1 && m_baseLayer) { 6041a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware LayerAndroid* layer = m_baseLayer->findById(layerId); 6051a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware // We need to make sure the drawTransform is up to date as this is 6061a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware // called before a draw() or drawGL() 6071a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware if (layer) { 6081a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware m_baseLayer->updateLayerPositions(m_visibleRect); 6091a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware return layer->drawTransform(); 6101a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware } 6111a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware } 6121a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware return 0; 6131a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware} 6141a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware 615304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mountint getHandleLayerId(SelectText::HandleId handleId, SkIPoint& cursorPoint, 616304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount FloatQuad& textBounds) { 617dea0c131566f424923425970fe5621305d136e5aJohn Reck SelectText* selectText = static_cast<SelectText*>(getDrawExtra(DrawExtrasSelection)); 618fba5bad67c2589216f05da70a7f2fbd537637672John Reck if (!selectText || !m_baseLayer) 619dea0c131566f424923425970fe5621305d136e5aJohn Reck return -1; 620dea0c131566f424923425970fe5621305d136e5aJohn Reck int layerId = selectText->caretLayerId(handleId); 621304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount IntRect cursorRect = selectText->caretRect(handleId); 622304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount IntRect textRect = selectText->textRect(handleId); 623304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount // Rects exclude the last pixel on right/bottom. We want only included pixels. 624304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount cursorPoint.set(cursorRect.x(), cursorRect.maxY() - 1); 6257f1e5ac384d6c663e2cb6b6bb7a58a300d16e1beGeorge Mount textRect.setHeight(std::max(1, textRect.height() - 1)); 6267f1e5ac384d6c663e2cb6b6bb7a58a300d16e1beGeorge Mount textRect.setWidth(std::max(1, textRect.width() - 1)); 627304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount textBounds = FloatQuad(textRect); 628304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount 6291a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware const TransformationMatrix* transform = getLayerTransform(layerId); 6301a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware if (transform) { 6311a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware // We're overloading the concept of Rect to be just the two 6321a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware // points (bottom-left and top-right. 6331a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware cursorPoint = transform->mapPoint(cursorPoint); 6341a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware textBounds = transform->mapQuad(textBounds); 635e5d643b22badb45c77ef040896bd8ac46edae7d0George Mount } 636730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount return layerId; 637730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount} 638730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount 639730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mountvoid mapLayerRect(int layerId, SkIRect& rect) { 6401a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware const TransformationMatrix* transform = getLayerTransform(layerId); 6411a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware if (transform) 6421a046452f8364930a3a52dd7620f9b7ab7137c31Mangesh Ghiware transform->mapRect(rect); 643dea0c131566f424923425970fe5621305d136e5aJohn Reck} 644dea0c131566f424923425970fe5621305d136e5aJohn Reck 645304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mountvoid floatQuadToQuadF(JNIEnv* env, const FloatQuad& nativeTextQuad, 646304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount jobject textQuad) 647304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount{ 648304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount jobject p1 = env->GetObjectField(textQuad, m_javaGlue.m_quadFP1); 649304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount jobject p2 = env->GetObjectField(textQuad, m_javaGlue.m_quadFP2); 650304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount jobject p3 = env->GetObjectField(textQuad, m_javaGlue.m_quadFP3); 651304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount jobject p4 = env->GetObjectField(textQuad, m_javaGlue.m_quadFP4); 652304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount GraphicsJNI::point_to_jpointf(nativeTextQuad.p1(), env, p1); 653304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount GraphicsJNI::point_to_jpointf(nativeTextQuad.p2(), env, p2); 654304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount GraphicsJNI::point_to_jpointf(nativeTextQuad.p3(), env, p3); 655304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount GraphicsJNI::point_to_jpointf(nativeTextQuad.p4(), env, p4); 656304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount env->DeleteLocalRef(p1); 657304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount env->DeleteLocalRef(p2); 658304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount env->DeleteLocalRef(p3); 659304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount env->DeleteLocalRef(p4); 660304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount} 661304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount 662a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck// This is called when WebView switches rendering modes in a more permanent fashion 663a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck// such as when the layer type is set or the view is attached/detached from the window 664a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reckint setHwAccelerated(bool hwAccelerated) { 665a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck if (!m_glWebViewState) 666a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck return 0; 667885e650b12d781be054b31ae6221925a0184dc33Chris Craik LayerAndroid* root = m_baseLayer; 668a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck if (root) 669a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck return root->setHwAccelerated(hwAccelerated); 670a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck return 0; 671a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck} 672a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck 673d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck bool m_isDrawingPaused; 6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate: // local state for WebView 6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // private to getFrameCache(); other functions operate in a different thread 6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebViewCore* m_viewImpl; 6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int m_generation; // associate unique ID with sent kit focus to match with ui 6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Corresponds to the same-named boolean on the java side. 6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool m_heightCanMeasure; 6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int m_lastDx; 6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SkMSec m_lastDxTime; 682dea0c131566f424923425970fe5621305d136e5aJohn Reck DrawExtra* m_extras[DRAW_EXTRAS_SIZE]; 6836d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba BaseLayerAndroid* m_baseLayer; 684908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase Functor* m_glDrawFunctor; 685a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING) 686c85ae2f04c704b80b18838059d2fc7b9a19d4921Derek Sollenberger GLWebViewState* m_glWebViewState; 687a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif 688a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount SkRect m_visibleRect; 68955b4bdbd661ac94fd05ab40de08250bf242d5346John Reck bool m_isHighEndGfx; 6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; // end of WebView class 6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 692908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase 693908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase/** 694908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * This class holds a function pointer and parameters for calling drawGL into a specific 695908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * viewport. The pointer to the Functor will be put on a framework display list to be called 696908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase * when the display list is replayed. 697908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase */ 698908703e420f4931f74527aaeb3d5faabdd66c28aChet Haaseclass GLDrawFunctor : Functor { 699908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase public: 700908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase GLDrawFunctor(WebView* _wvInstance, 701bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu int (WebView::*_funcPtr)(WebCore::IntRect&, WebCore::IntRect*, 702bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu WebCore::IntRect&, int, WebCore::IntRect&, jfloat, jint, bool), 703908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase WebCore::IntRect _viewRect, float _scale, int _extras) { 704908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase wvInstance = _wvInstance; 705908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase funcPtr = _funcPtr; 706908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase viewRect = _viewRect; 707908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase scale = _scale; 708908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase extras = _extras; 709908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase }; 71079d8e0434bfe00a793e8041f96dc02ec1d98e694Romain Guy status_t operator()(int messageId, void* data) { 711d71bb71a2be8c0f7eff98c981a5410aa49e04843Chris Craik TRACE_METHOD(); 712d71bb71a2be8c0f7eff98c981a5410aa49e04843Chris Craik 71379d8e0434bfe00a793e8041f96dc02ec1d98e694Romain Guy if (viewRect.isEmpty()) { 714821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase // NOOP operation if viewport is empty 715821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase return 0; 716821e0038ef13763a4ccfc038809b8cd02a2e1cf3Chet Haase } 71779d8e0434bfe00a793e8041f96dc02ec1d98e694Romain Guy 7189f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard WebCore::IntRect inval; 7199f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard int titlebarHeight = webViewRect.height() - viewRect.height(); 720b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner 721b1444e524d3f5e888d1ae3300b2658321fc56349Russell Brenner uirenderer::DrawGlInfo* info = reinterpret_cast<uirenderer::DrawGlInfo*>(data); 722be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard WebCore::IntRect clip(info->clipLeft, info->clipTop, 723be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard info->clipRight - info->clipLeft, 724be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard info->clipBottom - info->clipTop); 725d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu 726d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu WebCore::IntRect localViewRect = viewRect; 727d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu if (info->isLayer) { 728d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu // When webview is on a layer, we need to use the viewport relative 729d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu // to the FBO, rather than the screen(which will use viewRect). 730d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu localViewRect.setX(clip.x()); 731d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu localViewRect.setY(info->height - clip.y() - clip.height()); 732d08dc21a96bd91ee23a4419266186cadb4b43681Teng-Hui Zhu } 733bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu bool shouldDraw = (messageId == uirenderer::DrawGlInfo::kModeDraw); 734868c42d56aae84ed4cd33f9de0d93132e1483ddcTeng-Hui Zhu // Send the necessary info to the shader. 735868c42d56aae84ed4cd33f9de0d93132e1483ddcTeng-Hui Zhu TilesManager::instance()->shader()->setGLDrawInfo(info); 736868c42d56aae84ed4cd33f9de0d93132e1483ddcTeng-Hui Zhu 737bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu int returnFlags = (*wvInstance.*funcPtr)(localViewRect, &inval, webViewRect, 738bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu titlebarHeight, clip, scale, extras, shouldDraw); 739bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu if ((returnFlags & uirenderer::DrawGlInfo::kStatusDraw) != 0) { 7409f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard IntRect finalInval; 741bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu if (inval.isEmpty()) 7429f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard finalInval = webViewRect; 743bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu else { 7449f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard finalInval.setX(webViewRect.x() + inval.x()); 745be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard finalInval.setY(webViewRect.y() + titlebarHeight + inval.y()); 7469f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard finalInval.setWidth(inval.width()); 7479f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard finalInval.setHeight(inval.height()); 7489f5143f9ae49a8e5fdb7ea626c4efad66096b020Nicolas Roard } 749d1f5cf1ad8b20860bd9cb34a483451019124d1f9Romain Guy info->dirtyLeft = finalInval.x(); 750d1f5cf1ad8b20860bd9cb34a483451019124d1f9Romain Guy info->dirtyTop = finalInval.y(); 7511ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block info->dirtyRight = finalInval.maxX(); 7521ed8c4d16ac986307f1c0589a3a720a37e60f313Steve Block info->dirtyBottom = finalInval.maxY(); 753b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy } 754bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu // return 1 if invalidation needed, 2 to request non-drawing functor callback, 0 otherwise 755bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu ALOGV("returnFlags are %d, shouldDraw %d", returnFlags, shouldDraw); 756bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu return returnFlags; 757908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase } 758908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase void updateRect(WebCore::IntRect& _viewRect) { 759908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase viewRect = _viewRect; 760908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase } 761b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy void updateViewRect(WebCore::IntRect& _viewRect) { 762b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy webViewRect = _viewRect; 763b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy } 764d0a011b30b97598ee74f329aaa217a6ab733f1f1Teng-Hui Zhu void updateScale(float _scale) { 765d0a011b30b97598ee74f329aaa217a6ab733f1f1Teng-Hui Zhu scale = _scale; 766d0a011b30b97598ee74f329aaa217a6ab733f1f1Teng-Hui Zhu } 767908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase private: 768908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase WebView* wvInstance; 769bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu int (WebView::*funcPtr)(WebCore::IntRect&, WebCore::IntRect*, 770bf9aa54ac784685db3d2cd8c0d616b25b289c09eTeng-Hui Zhu WebCore::IntRect&, int, WebCore::IntRect&, float, int, bool); 771908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase WebCore::IntRect viewRect; 772b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy WebCore::IntRect webViewRect; 773908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase jfloat scale; 774908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase jint extras; 775908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase}; 776908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase 7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Native JNI methods 7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 78155b4bdbd661ac94fd05ab40de08250bf242d5346John Reckstatic void nativeCreate(JNIEnv *env, jobject obj, int viewImpl, 78255b4bdbd661ac94fd05ab40de08250bf242d5346John Reck jstring drawableDir, jboolean isHighEndGfx) 7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7844de82d04a6a82fee6e2d924768e88af58e966982Leon Scroggins WTF::String dir = jstringToWtfString(env, drawableDir); 785894aaa1bd5446eebf8169efa1998fbe6964c18d0Chris Craik new WebView(env, obj, viewImpl, dir, isHighEndGfx); 7868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // NEED THIS OR SOMETHING LIKE IT! 7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project //Release(obj); 7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 79046dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clarkstatic WebCore::IntRect jrect_to_webrect(JNIEnv* env, jobject obj) 79146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark{ 792a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount if (obj) { 793a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount int L, T, R, B; 794a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount GraphicsJNI::get_jrect(env, obj, &L, &T, &R, &B); 795a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount return WebCore::IntRect(L, T, R - L, B - T); 796a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount } else 797a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount return WebCore::IntRect(); 798a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount} 799a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount 800a5e649bc4d58bf3da959deae077307c487e2a3a6George Mountstatic SkRect jrectf_to_rect(JNIEnv* env, jobject obj) 801a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount{ 802a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount SkRect rect = SkRect::MakeEmpty(); 803a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount if (obj) 804a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount GraphicsJNI::jrectf_to_rect(env, obj, &rect); 805a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount return rect; 80646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark} 80746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark 808a5e649bc4d58bf3da959deae077307c487e2a3a6George Mountstatic jint nativeDraw(JNIEnv *env, jobject obj, jobject canv, 809a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount jobject visible, jint color, 8106d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba jint extras, jboolean split) { 8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SkCanvas* canvas = GraphicsJNI::getNativeCanvas(env, canv); 812a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount WebView* webView = GET_NATIVE_VIEW(env, obj); 813a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount SkRect visibleRect = jrectf_to_rect(env, visible); 814a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount webView->setVisibleRect(visibleRect); 815dea0c131566f424923425970fe5621305d136e5aJohn Reck PictureSet* pictureSet = webView->draw(canvas, color, 816dea0c131566f424923425970fe5621305d136e5aJohn Reck static_cast<WebView::DrawExtras>(extras), split); 817a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount return reinterpret_cast<jint>(pictureSet); 8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 82024b412c6f16018a2a2971eef09648ce105ef618aChris Craikstatic jint nativeCreateDrawGLFunction(JNIEnv *env, jobject obj, jint nativeView, 821223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck jobject jrect, jobject jviewrect, 822a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount jobject jvisiblerect, 823223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck jfloat scale, jint extras) { 824a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount WebCore::IntRect viewRect = jrect_to_webrect(env, jrect); 825223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck WebView *wvInstance = (WebView*) nativeView; 826a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount SkRect visibleRect = jrectf_to_rect(env, jvisiblerect); 827a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount wvInstance->setVisibleRect(visibleRect); 828a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount 829a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount GLDrawFunctor* functor = new GLDrawFunctor(wvInstance, 830a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount &android::WebView::drawGL, viewRect, scale, extras); 831908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase wvInstance->setFunctor((Functor*) functor); 832b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy 833a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount WebCore::IntRect webViewRect = jrect_to_webrect(env, jviewrect); 834b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy functor->updateViewRect(webViewRect); 835b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy 836908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase return (jint)functor; 837908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase} 838908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase 83924b412c6f16018a2a2971eef09648ce105ef618aChris Craikstatic jint nativeGetDrawGLFunction(JNIEnv *env, jobject obj, jint nativeView) { 84024b412c6f16018a2a2971eef09648ce105ef618aChris Craik WebView *wvInstance = (WebView*) nativeView; 84124b412c6f16018a2a2971eef09648ce105ef618aChris Craik if (!wvInstance) 84224b412c6f16018a2a2971eef09648ce105ef618aChris Craik return 0; 84324b412c6f16018a2a2971eef09648ce105ef618aChris Craik 84424b412c6f16018a2a2971eef09648ce105ef618aChris Craik return (jint) wvInstance->getFunctor(); 84524b412c6f16018a2a2971eef09648ce105ef618aChris Craik} 84624b412c6f16018a2a2971eef09648ce105ef618aChris Craik 84724b412c6f16018a2a2971eef09648ce105ef618aChris Craikstatic void nativeUpdateDrawGLFunction(JNIEnv *env, jobject obj, jint nativeView, jobject jrect, 848d0a011b30b97598ee74f329aaa217a6ab733f1f1Teng-Hui Zhu jobject jviewrect, jobject jvisiblerect, jfloat scale) { 84924b412c6f16018a2a2971eef09648ce105ef618aChris Craik WebView *wvInstance = (WebView*) nativeView; 850a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount if (wvInstance) { 851908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase GLDrawFunctor* functor = (GLDrawFunctor*) wvInstance->getFunctor(); 852a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount if (functor) { 853a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount WebCore::IntRect viewRect = jrect_to_webrect(env, jrect); 854908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase functor->updateRect(viewRect); 855b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy 856a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount SkRect visibleRect = jrectf_to_rect(env, jvisiblerect); 857a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount wvInstance->setVisibleRect(visibleRect); 858a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount 859a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount WebCore::IntRect webViewRect = jrect_to_webrect(env, jviewrect); 860b5ec18911e853fdea87aad8900400c01e6493f5fRomain Guy functor->updateViewRect(webViewRect); 861d0a011b30b97598ee74f329aaa217a6ab733f1f1Teng-Hui Zhu 862d0a011b30b97598ee74f329aaa217a6ab733f1f1Teng-Hui Zhu functor->updateScale(scale); 863908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase } 864908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase } 865908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase} 866908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase 867223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reckstatic bool nativeEvaluateLayersAnimations(JNIEnv *env, jobject obj, jint nativeView) 868797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard{ 869c6151a04881a67d08d91237891fbc7cb82927219John Reck // only call in software rendering, initialize and evaluate animations 870797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#if USE(ACCELERATED_COMPOSITING) 871885e650b12d781be054b31ae6221925a0184dc33Chris Craik BaseLayerAndroid* baseLayer = ((WebView*)nativeView)->getBaseLayer(); 872885e650b12d781be054b31ae6221925a0184dc33Chris Craik if (baseLayer) { 873885e650b12d781be054b31ae6221925a0184dc33Chris Craik baseLayer->initAnimations(); 874885e650b12d781be054b31ae6221925a0184dc33Chris Craik return baseLayer->evaluateAnimations(); 875c6151a04881a67d08d91237891fbc7cb82927219John Reck } 876797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard#endif 877797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard return false; 878797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard} 879797e4f1087e408060f2812c79bddcd2b73a3830dNicolas Roard 880246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craikstatic bool nativeSetBaseLayer(JNIEnv *env, jobject obj, jint nativeView, jint layer, jobject inval, 881246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik jboolean showVisualIndicator, 882246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik jboolean isPictureAfterFirstLayout) 883f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark{ 8846d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba BaseLayerAndroid* layerImpl = reinterpret_cast<BaseLayerAndroid*>(layer); 88567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard SkRegion invalRegion; 88667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (inval) 88767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard invalRegion = *GraphicsJNI::getNativeRegion(env, inval); 888246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik return ((WebView*)nativeView)->setBaseLayer(layerImpl, invalRegion, showVisualIndicator, 889246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik isPictureAfterFirstLayout); 8906d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba} 8916d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba 8924212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reckstatic BaseLayerAndroid* nativeGetBaseLayer(JNIEnv *env, jobject obj) 8934212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck{ 8944212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck return GET_NATIVE_VIEW(env, obj)->getBaseLayer(); 8954212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck} 8964212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck 8976d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic void nativeReplaceBaseContent(JNIEnv *env, jobject obj, jint content) 8986d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{ 8996d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba PictureSet* set = reinterpret_cast<PictureSet*>(content); 9006d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba GET_NATIVE_VIEW(env, obj)->replaceBaseContent(set); 9016d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba} 9026d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba 9036d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic void nativeCopyBaseContentToPicture(JNIEnv *env, jobject obj, jobject pict) 9046d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{ 9056d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba SkPicture* picture = GraphicsJNI::getNativePicture(env, pict); 9066d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba GET_NATIVE_VIEW(env, obj)->copyBaseContentToPicture(picture); 9076d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba} 9086d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba 9096d43b9ceb777071c088fe12ee94af80e34816bcfGrace Klobastatic bool nativeHasContent(JNIEnv *env, jobject obj) 9106d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba{ 9116d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba return GET_NATIVE_VIEW(env, obj)->hasContent(); 912f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark} 913f4cefb9302ee62602c19cdfbdb6cc1fbdf540953Cary Clark 9149092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clarkstatic jobject nativeLayerBounds(JNIEnv* env, jobject obj, jint jlayer) 9159092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark{ 9169092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark SkRect r; 9179092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark#if USE(ACCELERATED_COMPOSITING) 9189092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark LayerAndroid* layer = (LayerAndroid*) jlayer; 9199092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark r = layer->bounds(); 9209092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark#else 9219092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark r.setEmpty(); 9229092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark#endif 9239092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark SkIRect irect; 9249092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark r.round(&irect); 9259092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark jclass rectClass = env->FindClass("android/graphics/Rect"); 9269092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark jmethodID init = env->GetMethodID(rectClass, "<init>", "(IIII)V"); 9279092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark jobject rect = env->NewObject(rectClass, init, irect.fLeft, irect.fTop, 9289092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark irect.fRight, irect.fBottom); 9299092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark env->DeleteLocalRef(rectClass); 9309092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark return rect; 9319092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark} 9329092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark 9338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeSetHeightCanMeasure(JNIEnv *env, jobject obj, bool measure) 9348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 9366dd76b804786ec760bb04b137a6bf017064226dcSteve Block ALOG_ASSERT(view, "view not set in nativeSetHeightCanMeasure"); 9378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view->setHeightCanMeasure(measure); 9388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeDestroy(JNIEnv *env, jobject obj) 9418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 943a09e7cf49f43950a799f936bf42a9912d696547bSteve Block ALOGD("nativeDestroy view: %p", view); 9446dd76b804786ec760bb04b137a6bf017064226dcSteve Block ALOG_ASSERT(view, "view not set in nativeDestroy"); 9458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete view; 9468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9488360bc9c9facd690e42379610cbbb368d3d705efCary Clarkstatic void nativeStopGL(JNIEnv *env, jobject obj) 9498360bc9c9facd690e42379610cbbb368d3d705efCary Clark{ 9508360bc9c9facd690e42379610cbbb368d3d705efCary Clark GET_NATIVE_VIEW(env, obj)->stopGL(); 9518360bc9c9facd690e42379610cbbb368d3d705efCary Clark} 9528360bc9c9facd690e42379610cbbb368d3d705efCary Clark 9538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic jobject nativeGetSelection(JNIEnv *env, jobject obj) 9548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, obj); 9566dd76b804786ec760bb04b137a6bf017064226dcSteve Block ALOG_ASSERT(view, "view not set in %s", __FUNCTION__); 9575e5962825729a211e093fd615ddc9e5b0bec10bdCary Clark String selection = view->getSelection(); 95879b35ce109b9fdca7c7e3af24996c1a2a612f1a4Steve Block return wtfStringToJstring(env, selection); 9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 961a3a38731f4eeb01d2a42965b6c875d957999969dChris Craikstatic void nativeDiscardAllTextures(JNIEnv *env, jobject obj) 962a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik{ 963a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik //discard all textures for debugging/test purposes, but not gl backing memory 964a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik bool allTextures = true, deleteGLTextures = false; 965a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik TilesManager::instance()->discardTextures(allTextures, deleteGLTextures); 966af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik} 967af33356e96e56310c66b47b6db913e1a61981ca3Chris Craik 9685dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic void nativeTileProfilingStart(JNIEnv *env, jobject obj) 9695dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{ 970687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik TilesManager::instance()->getProfiler()->start(); 9715dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik} 9725dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik 9735dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic float nativeTileProfilingStop(JNIEnv *env, jobject obj) 9745dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{ 975687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return TilesManager::instance()->getProfiler()->stop(); 9765dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik} 9775dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik 9785dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic void nativeTileProfilingClear(JNIEnv *env, jobject obj) 9795dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{ 980687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik TilesManager::instance()->getProfiler()->clear(); 9815dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik} 9825dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik 9835dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic int nativeTileProfilingNumFrames(JNIEnv *env, jobject obj) 9845dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{ 985687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return TilesManager::instance()->getProfiler()->numFrames(); 9865dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik} 9875dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik 9885dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craikstatic int nativeTileProfilingNumTilesInFrame(JNIEnv *env, jobject obj, int frame) 9895dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{ 990687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return TilesManager::instance()->getProfiler()->numTilesInFrame(frame); 9915dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik} 9925dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik 993687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craikstatic int nativeTileProfilingGetInt(JNIEnv *env, jobject obj, int frame, int tile, jstring jkey) 9945dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{ 995687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik WTF::String key = jstringToWtfString(env, jkey); 996687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik TileProfileRecord* record = TilesManager::instance()->getProfiler()->getTile(frame, tile); 997687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik 998687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik if (key == "left") 999687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return record->left; 1000687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik if (key == "top") 1001687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return record->top; 1002687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik if (key == "right") 1003687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return record->right; 1004687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik if (key == "bottom") 1005687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return record->bottom; 1006687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik if (key == "level") 1007687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return record->level; 1008687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik if (key == "isReady") 1009687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return record->isReady ? 1 : 0; 1010687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return -1; 10115dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik} 10125dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik 1013687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craikstatic float nativeTileProfilingGetFloat(JNIEnv *env, jobject obj, int frame, int tile, jstring jkey) 10145dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik{ 1015687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik TileProfileRecord* record = TilesManager::instance()->getProfiler()->getTile(frame, tile); 1016687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik return record->scale; 10175dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik} 10185dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik 10198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_DUMP_DISPLAY_TREE 10208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void dumpToFile(const char text[], void* file) { 10218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fwrite(text, 1, strlen(text), reinterpret_cast<FILE*>(file)); 10228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fwrite("\n", 1, 1, reinterpret_cast<FILE*>(file)); 10238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 10258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1026c2992cfb02b098d6e8579b6a0ba7f7a11c7753feJohn Reck// Return true to view invalidate WebView 1027f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roardstatic bool nativeSetProperty(JNIEnv *env, jobject obj, jstring jkey, jstring jvalue) 1028d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck{ 1029d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck WTF::String key = jstringToWtfString(env, jkey); 1030d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck WTF::String value = jstringToWtfString(env, jvalue); 1031ef238925ea0ba6305e4540aff5c6953503993f3bNicolas Roard if (key == "inverted") { 1032bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik bool shouldInvert = (value == "true"); 1033bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik TilesManager::instance()->setInvertedScreen(shouldInvert); 1034f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard return true; 1035d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck } 10368852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu else if (key == "inverted_contrast") { 1037bbb9caa2571e2c0192861a336c358412e9e7f0c7Nicolas Roard float contrast = value.toFloat(); 1038bbb9caa2571e2c0192861a336c358412e9e7f0c7Nicolas Roard TilesManager::instance()->setInvertedScreenContrast(contrast); 1039f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard return true; 1040bbb9caa2571e2c0192861a336c358412e9e7f0c7Nicolas Roard } 10418852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu else if (key == "enable_cpu_upload_path") { 10420960fe0e966317c4728542e9cfaa259523665900Teng-Hui Zhu TilesManager::instance()->transferQueue()->setTextureUploadType( 10430960fe0e966317c4728542e9cfaa259523665900Teng-Hui Zhu value == "true" ? CpuUpload : GpuUpload); 10440960fe0e966317c4728542e9cfaa259523665900Teng-Hui Zhu } 10458852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu else if (key == "use_minimal_memory") { 10468852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu TilesManager::instance()->setUseMinimalMemory(value == "true"); 10478852b0905b1a50ca045eb4bd19b2589aad663b5cTeng-Hui Zhu } 1048bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik else if (key == "use_double_buffering") { 1049bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik TilesManager::instance()->setUseDoubleBuffering(value == "true"); 1050bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik } 1051bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik else if (key == "tree_updates") { 1052d8be9016b7fda67a91b4ee17b3b2e7ba692ee553Chris Craik TilesManager::instance()->clearContentUpdates(); 1053bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik } 1054f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard return false; 1055d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck} 1056d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck 1057bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craikstatic jstring nativeGetProperty(JNIEnv *env, jobject obj, jstring jkey) 1058d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck{ 1059bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik WTF::String key = jstringToWtfString(env, jkey); 1060bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik if (key == "tree_updates") { 1061d8be9016b7fda67a91b4ee17b3b2e7ba692ee553Chris Craik int updates = TilesManager::instance()->getContentUpdates(); 1062bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik WTF::String wtfUpdates = WTF::String::number(updates); 1063bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik return wtfStringToJstring(env, wtfUpdates); 1064bac79a8ecce7b3aaf3bc4964957c9c59f163de38Chris Craik } 1065d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck return 0; 1066d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck} 1067d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck 106852f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reckstatic void nativeOnTrimMemory(JNIEnv *env, jobject obj, jint level) 106952f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck{ 10702986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik if (TilesManager::hardwareAccelerationEnabled()) { 1071e1dfe84b38ed080c7bb7ac00fd9e3c6c590a147dTeng-Hui Zhu // When we got TRIM_MEMORY_MODERATE or TRIM_MEMORY_COMPLETE, we should 1072e1dfe84b38ed080c7bb7ac00fd9e3c6c590a147dTeng-Hui Zhu // make sure the transfer queue is empty and then abandon the Surface 1073e1dfe84b38ed080c7bb7ac00fd9e3c6c590a147dTeng-Hui Zhu // Texture to avoid ANR b/c framework may destroy the EGL context. 1074e1dfe84b38ed080c7bb7ac00fd9e3c6c590a147dTeng-Hui Zhu // Refer to WindowManagerImpl.java for conditions we followed. 107500144be011338276839a08a66ae79b14629b268bTeng-Hui Zhu TilesManager* tilesManager = TilesManager::instance(); 1076d2339fb5509a885ab17100ead6b3a543e7d4d7f7Teng-Hui Zhu if ((level >= TRIM_MEMORY_MODERATE 1077d2339fb5509a885ab17100ead6b3a543e7d4d7f7Teng-Hui Zhu && !tilesManager->highEndGfx()) 1078d2339fb5509a885ab17100ead6b3a543e7d4d7f7Teng-Hui Zhu || level >= TRIM_MEMORY_COMPLETE) { 10790f1c02efd8cc889db10575dff2749d103ceeaf87Teng-Hui Zhu ALOGD("OnTrimMemory with EGL Context %p", eglGetCurrentContext()); 10802ac76fe4e18c3325c8b3bb8f9435fdc7b96c0acaTeng-Hui Zhu tilesManager->cleanupGLResources(); 1081886eb87d34570b706a0f17fa944d98870ed6a2afTeng-Hui Zhu } 1082e1dfe84b38ed080c7bb7ac00fd9e3c6c590a147dTeng-Hui Zhu 1083a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik bool freeAllTextures = (level > TRIM_MEMORY_UI_HIDDEN), glTextures = true; 108400144be011338276839a08a66ae79b14629b268bTeng-Hui Zhu tilesManager->discardTextures(freeAllTextures, glTextures); 10852986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik } 108652f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck} 108752f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck 10888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void nativeDumpDisplayTree(JNIEnv* env, jobject jwebview, jstring jurl) 10898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_DUMP_DISPLAY_TREE 10918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* view = GET_NATIVE_VIEW(env, jwebview); 10926dd76b804786ec760bb04b137a6bf017064226dcSteve Block ALOG_ASSERT(view, "view not set in %s", __FUNCTION__); 10938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1094bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed if (view && view->getWebViewCore()) { 1095bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed FILE* file = fopen(DISPLAY_TREE_LOG_FILE, "w"); 1096bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed if (file) { 1097bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed SkFormatDumper dumper(dumpToFile, file); 1098bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed // dump the URL 1099bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed if (jurl) { 1100bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed const char* str = env->GetStringUTFChars(jurl, 0); 1101bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed SkDebugf("Dumping %s to %s\n", str, DISPLAY_TREE_LOG_FILE); 1102bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed dumpToFile(str, file); 1103bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed env->ReleaseStringUTFChars(jurl, str); 11048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1105bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed // now dump the display tree 1106bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed SkDumpCanvas canvas(&dumper); 1107bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed // this will playback the picture into the canvas, which will 1108bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed // spew its contents to the dumper 1109dea0c131566f424923425970fe5621305d136e5aJohn Reck view->draw(&canvas, 0, WebView::DrawExtrasNone, false); 1110bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed // we're done with the file now 1111bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed fwrite("\n", 1, 1, file); 1112bc34c827fb04edf4fb309ff7e0fc4fceb474809eMike Reed fclose(file); 11138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1114859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard#if USE(ACCELERATED_COMPOSITING) 1115885e650b12d781be054b31ae6221925a0184dc33Chris Craik const LayerAndroid* baseLayer = view->getBaseLayer(); 1116885e650b12d781be054b31ae6221925a0184dc33Chris Craik if (baseLayer) { 1117859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard FILE* file = fopen(LAYERS_TREE_LOG_FILE,"w"); 1118859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard if (file) { 1119885e650b12d781be054b31ae6221925a0184dc33Chris Craik baseLayer->dumpLayers(file, 0); 1120859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard fclose(file); 1121859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard } 1122859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard } 1123859c5759717164a923c2267b9ee8437a4dafe5c4Nicolas Roard#endif 11248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 11268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1128f81c672a4f5c06621000a6df0984cde689397d94Cary Clarkstatic int nativeScrollableLayer(JNIEnv* env, jobject jwebview, jint x, jint y, 1129f81c672a4f5c06621000a6df0984cde689397d94Cary Clark jobject rect, jobject bounds) 1130a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{ 1131a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott WebView* view = GET_NATIVE_VIEW(env, jwebview); 11326dd76b804786ec760bb04b137a6bf017064226dcSteve Block ALOG_ASSERT(view, "view not set in %s", __FUNCTION__); 1133f81c672a4f5c06621000a6df0984cde689397d94Cary Clark SkIRect nativeRect, nativeBounds; 1134f81c672a4f5c06621000a6df0984cde689397d94Cary Clark int id = view->scrollableLayer(x, y, &nativeRect, &nativeBounds); 1135f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins if (rect) 1136f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins GraphicsJNI::irect_to_jrect(nativeRect, env, rect); 1137f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins if (bounds) 1138f0425628b4e83bf9e1c8275d809d433baeaf768cLeon Scroggins GraphicsJNI::irect_to_jrect(nativeBounds, env, bounds); 113922e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott return id; 1140a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott} 1141a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott 114222e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scottstatic bool nativeScrollLayer(JNIEnv* env, jobject obj, jint layerId, jint x, 114322e283368b8dfd19cf2caa342a5c921397f0dc41Patrick Scott jint y) 1144a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott{ 1145a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#if ENABLE(ANDROID_OVERFLOW_SCROLL) 1146a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott WebView* view = GET_NATIVE_VIEW(env, obj); 114770adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik view->scrollLayer(layerId, x, y); 114870adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik 114970adfd756fa5e71bd6913f3a1d8223ca26d8ec92Chris Craik //TODO: the below only needed for the SW rendering path 1150885e650b12d781be054b31ae6221925a0184dc33Chris Craik LayerAndroid* baseLayer = view->getBaseLayer(); 1151885e650b12d781be054b31ae6221925a0184dc33Chris Craik if (!baseLayer) 11528598c9fb9f861f25ab14efde9efb19cb91d7df1cPatrick Scott return false; 1153885e650b12d781be054b31ae6221925a0184dc33Chris Craik LayerAndroid* layer = baseLayer->findById(layerId); 1154fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott if (!layer || !layer->contentIsScrollable()) 1155a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott return false; 1156fe812d40b53dc52d5c929e39b5e293af8b6cb4e4Patrick Scott return static_cast<ScrollableLayerAndroid*>(layer)->scrollTo(x, y); 1157a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott#endif 1158a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott return false; 1159a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott} 1160a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott 1161f51a51f6ea307f4311a04aa865a42b233269540bChris Craikstatic void nativeSetIsScrolling(JNIEnv* env, jobject jwebview, jboolean isScrolling) 1162f51a51f6ea307f4311a04aa865a42b233269540bChris Craik{ 1163f51a51f6ea307f4311a04aa865a42b233269540bChris Craik WebView* view = GET_NATIVE_VIEW(env, jwebview); 11646dd76b804786ec760bb04b137a6bf017064226dcSteve Block ALOG_ASSERT(view, "view not set in %s", __FUNCTION__); 1165f51a51f6ea307f4311a04aa865a42b233269540bChris Craik view->setIsScrolling(isScrolling); 1166f51a51f6ea307f4311a04aa865a42b233269540bChris Craik} 1167f51a51f6ea307f4311a04aa865a42b233269540bChris Craik 1168c7e578330aece3c556ef205365c24676687223e2Derek Sollenbergerstatic void nativeUseHardwareAccelSkia(JNIEnv*, jobject, jboolean enabled) 1169c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger{ 1170c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger BaseRenderer::setCurrentRendererType(enabled ? BaseRenderer::Ganesh : BaseRenderer::Raster); 1171c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger} 1172c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger 11735e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reckstatic int nativeGetBackgroundColor(JNIEnv* env, jobject obj) 11745e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck{ 11755e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck WebView* view = GET_NATIVE_VIEW(env, obj); 11765e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck BaseLayerAndroid* baseLayer = view->getBaseLayer(); 11775e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck if (baseLayer) { 11785e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck WebCore::Color color = baseLayer->getBackgroundColor(); 11795e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck if (color.isValid()) 11805e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck return SkColorSetARGB(color.alpha(), color.red(), 11815e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck color.green(), color.blue()); 11825e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck } 11835e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck return SK_ColorWHITE; 11845e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck} 11855e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck 1186d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reckstatic void nativeSetPauseDrawing(JNIEnv *env, jobject obj, jint nativeView, 1187d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck jboolean pause) 1188d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck{ 1189d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck ((WebView*)nativeView)->m_isDrawingPaused = pause; 1190d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck} 1191d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck 1192dea0c131566f424923425970fe5621305d136e5aJohn Reckstatic void nativeSetTextSelection(JNIEnv *env, jobject obj, jint nativeView, 1193dea0c131566f424923425970fe5621305d136e5aJohn Reck jint selectionPtr) 1194dea0c131566f424923425970fe5621305d136e5aJohn Reck{ 1195dea0c131566f424923425970fe5621305d136e5aJohn Reck SelectText* selection = reinterpret_cast<SelectText*>(selectionPtr); 1196dea0c131566f424923425970fe5621305d136e5aJohn Reck reinterpret_cast<WebView*>(nativeView)->setTextSelection(selection); 1197dea0c131566f424923425970fe5621305d136e5aJohn Reck} 1198dea0c131566f424923425970fe5621305d136e5aJohn Reck 1199dea0c131566f424923425970fe5621305d136e5aJohn Reckstatic jint nativeGetHandleLayerId(JNIEnv *env, jobject obj, jint nativeView, 1200304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount jint handleIndex, jobject cursorPoint, 1201304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount jobject textQuad) 1202dea0c131566f424923425970fe5621305d136e5aJohn Reck{ 1203dea0c131566f424923425970fe5621305d136e5aJohn Reck WebView* webview = reinterpret_cast<WebView*>(nativeView); 1204304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount SkIPoint nativePoint; 1205304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount FloatQuad nativeTextQuad; 1206304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount int layerId = webview->getHandleLayerId((SelectText::HandleId) handleIndex, 1207304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount nativePoint, nativeTextQuad); 1208304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount if (cursorPoint) 1209304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount GraphicsJNI::ipoint_to_jpoint(nativePoint, env, cursorPoint); 1210304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount if (textQuad) 1211304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount webview->floatQuadToQuadF(env, nativeTextQuad, textQuad); 1212dea0c131566f424923425970fe5621305d136e5aJohn Reck return layerId; 1213dea0c131566f424923425970fe5621305d136e5aJohn Reck} 1214dea0c131566f424923425970fe5621305d136e5aJohn Reck 1215dea0c131566f424923425970fe5621305d136e5aJohn Reckstatic jboolean nativeIsBaseFirst(JNIEnv *env, jobject obj, jint nativeView) 1216dea0c131566f424923425970fe5621305d136e5aJohn Reck{ 1217dea0c131566f424923425970fe5621305d136e5aJohn Reck WebView* webview = reinterpret_cast<WebView*>(nativeView); 1218dea0c131566f424923425970fe5621305d136e5aJohn Reck SelectText* select = static_cast<SelectText*>( 1219dea0c131566f424923425970fe5621305d136e5aJohn Reck webview->getDrawExtra(WebView::DrawExtrasSelection)); 1220dea0c131566f424923425970fe5621305d136e5aJohn Reck return select ? select->isBaseFirst() : false; 1221dea0c131566f424923425970fe5621305d136e5aJohn Reck} 1222dea0c131566f424923425970fe5621305d136e5aJohn Reck 1223730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mountstatic void nativeMapLayerRect(JNIEnv *env, jobject obj, jint nativeView, 1224730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount jint layerId, jobject rect) 1225730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount{ 1226730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount WebView* webview = reinterpret_cast<WebView*>(nativeView); 1227730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount SkIRect nativeRect; 1228730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount GraphicsJNI::jrect_to_irect(env, rect, &nativeRect); 1229730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount webview->mapLayerRect(layerId, nativeRect); 1230730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount GraphicsJNI::irect_to_jrect(nativeRect, env, rect); 1231730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount} 1232730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount 1233a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reckstatic jint nativeSetHwAccelerated(JNIEnv *env, jobject obj, jint nativeView, 1234a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck jboolean hwAccelerated) 1235a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck{ 1236a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck WebView* webview = reinterpret_cast<WebView*>(nativeView); 1237a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck return webview->setHwAccelerated(hwAccelerated); 1238a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck} 1239a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck 12408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 12418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * JNI registration 12428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 12438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic JNINativeMethod gJavaWebViewMethods[] = { 124455b4bdbd661ac94fd05ab40de08250bf242d5346John Reck { "nativeCreate", "(ILjava/lang/String;Z)V", 12458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (void*) nativeCreate }, 12468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { "nativeDestroy", "()V", 12478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (void*) nativeDestroy }, 1248a5e649bc4d58bf3da959deae077307c487e2a3a6George Mount { "nativeDraw", "(Landroid/graphics/Canvas;Landroid/graphics/RectF;IIZ)I", 12496d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba (void*) nativeDraw }, 125024b412c6f16018a2a2971eef09648ce105ef618aChris Craik { "nativeCreateDrawGLFunction", "(ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/RectF;FI)I", 125124b412c6f16018a2a2971eef09648ce105ef618aChris Craik (void*) nativeCreateDrawGLFunction }, 125224b412c6f16018a2a2971eef09648ce105ef618aChris Craik { "nativeGetDrawGLFunction", "(I)I", 1253908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase (void*) nativeGetDrawGLFunction }, 125424b412c6f16018a2a2971eef09648ce105ef618aChris Craik { "nativeUpdateDrawGLFunction", "(ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/RectF;F)V", 1255908703e420f4931f74527aaeb3d5faabdd66c28aChet Haase (void*) nativeUpdateDrawGLFunction }, 125646dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark { "nativeDumpDisplayTree", "(Ljava/lang/String;)V", 125746dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeDumpDisplayTree }, 1258223589b3e07f05960e8da16a5addce6fbfbfa9dfJohn Reck { "nativeEvaluateLayersAnimations", "(I)Z", 125987962ce00229855c098ba12cee8d5c015a835289Cary Clark (void*) nativeEvaluateLayersAnimations }, 12605e5962825729a211e093fd615ddc9e5b0bec10bdCary Clark { "nativeGetSelection", "()Ljava/lang/String;", 126146dfee13b2bec1b39f46c138df565b2207ccbc86Cary Clark (void*) nativeGetSelection }, 12629092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark { "nativeLayerBounds", "(I)Landroid/graphics/Rect;", 12639092f30ce1d2ad138d0095acddc2f5f4b2a025f9Cary Clark (void*) nativeLayerBounds }, 12648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { "nativeSetHeightCanMeasure", "(Z)V", 12658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (void*) nativeSetHeightCanMeasure }, 1266246bd5b4427d0a0feaa2e1a128be9ad53100631cChris Craik { "nativeSetBaseLayer", "(IILandroid/graphics/Region;ZZ)Z", 12676d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba (void*) nativeSetBaseLayer }, 12684212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck { "nativeGetBaseLayer", "()I", 12694212fae38ffee2bbb657dd19e4ae8b7c735f4953John Reck (void*) nativeGetBaseLayer }, 12706d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba { "nativeReplaceBaseContent", "(I)V", 12716d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba (void*) nativeReplaceBaseContent }, 12726d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba { "nativeCopyBaseContentToPicture", "(Landroid/graphics/Picture;)V", 12736d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba (void*) nativeCopyBaseContentToPicture }, 12746d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba { "nativeHasContent", "()Z", 12756d43b9ceb777071c088fe12ee94af80e34816bcfGrace Kloba (void*) nativeHasContent }, 1276a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik { "nativeDiscardAllTextures", "()V", 1277a3a38731f4eeb01d2a42965b6c875d957999969dChris Craik (void*) nativeDiscardAllTextures }, 12785dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik { "nativeTileProfilingStart", "()V", 12795dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik (void*) nativeTileProfilingStart }, 12805dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik { "nativeTileProfilingStop", "()F", 12815dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik (void*) nativeTileProfilingStop }, 12825dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik { "nativeTileProfilingClear", "()V", 12835dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik (void*) nativeTileProfilingClear }, 12845dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik { "nativeTileProfilingNumFrames", "()I", 12855dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik (void*) nativeTileProfilingNumFrames }, 12865dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik { "nativeTileProfilingNumTilesInFrame", "(I)I", 12875dcd286d3e3e60f6a090f775a1fdceb40f578b75Chris Craik (void*) nativeTileProfilingNumTilesInFrame }, 1288687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik { "nativeTileProfilingGetInt", "(IILjava/lang/String;)I", 1289687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik (void*) nativeTileProfilingGetInt }, 1290687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik { "nativeTileProfilingGetFloat", "(IILjava/lang/String;)F", 1291687472b6cb489b5d3ea6a9a2fff110a685c27a79Chris Craik (void*) nativeTileProfilingGetFloat }, 12928360bc9c9facd690e42379610cbbb368d3d705efCary Clark { "nativeStopGL", "()V", 12938360bc9c9facd690e42379610cbbb368d3d705efCary Clark (void*) nativeStopGL }, 1294f81c672a4f5c06621000a6df0984cde689397d94Cary Clark { "nativeScrollableLayer", "(IILandroid/graphics/Rect;Landroid/graphics/Rect;)I", 1295a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott (void*) nativeScrollableLayer }, 1296a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott { "nativeScrollLayer", "(III)Z", 1297a8d0e5a36718ee59b84a577053458bded49e369aPatrick Scott (void*) nativeScrollLayer }, 1298f51a51f6ea307f4311a04aa865a42b233269540bChris Craik { "nativeSetIsScrolling", "(Z)V", 1299f51a51f6ea307f4311a04aa865a42b233269540bChris Craik (void*) nativeSetIsScrolling }, 1300c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger { "nativeUseHardwareAccelSkia", "(Z)V", 1301c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger (void*) nativeUseHardwareAccelSkia }, 13025e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck { "nativeGetBackgroundColor", "()I", 13035e21d2b8b3bc9de06626a4cb28f37f06322c9f56John Reck (void*) nativeGetBackgroundColor }, 1304f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard { "nativeSetProperty", "(Ljava/lang/String;Ljava/lang/String;)Z", 1305d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck (void*) nativeSetProperty }, 1306d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck { "nativeGetProperty", "(Ljava/lang/String;)Ljava/lang/String;", 1307d2c2030045e0e26787ff8b9935d449e3be8a71ccJohn Reck (void*) nativeGetProperty }, 130852f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck { "nativeOnTrimMemory", "(I)V", 130952f5c337d737fdbaa361fc46b3e0aff2bb27cbaeJohn Reck (void*) nativeOnTrimMemory }, 1310d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck { "nativeSetPauseDrawing", "(IZ)V", 1311d355e69574bd6cae6a03fbfeee0c7da61aa7a98cJohn Reck (void*) nativeSetPauseDrawing }, 1312dea0c131566f424923425970fe5621305d136e5aJohn Reck { "nativeSetTextSelection", "(II)V", 1313dea0c131566f424923425970fe5621305d136e5aJohn Reck (void*) nativeSetTextSelection }, 1314304991de60a64b43bffd0c910655ee4ef1e9683cGeorge Mount { "nativeGetHandleLayerId", "(IILandroid/graphics/Point;Landroid/webkit/QuadF;)I", 1315dea0c131566f424923425970fe5621305d136e5aJohn Reck (void*) nativeGetHandleLayerId }, 1316dea0c131566f424923425970fe5621305d136e5aJohn Reck { "nativeIsBaseFirst", "(I)Z", 1317dea0c131566f424923425970fe5621305d136e5aJohn Reck (void*) nativeIsBaseFirst }, 1318730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount { "nativeMapLayerRect", "(IILandroid/graphics/Rect;)V", 1319730ac8198c5c9a59a2b11e54657155f3ea33d83fGeorge Mount (void*) nativeMapLayerRect }, 1320a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck { "nativeSetHwAccelerated", "(IZ)I", 1321a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck (void*) nativeSetHwAccelerated }, 13228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 13238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1324b92850e0391d674b9c4826b66105aaa3dd3eef96Steve Blockint registerWebView(JNIEnv* env) 13258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 132657ae1393d3097edada2640b40c895396b69cc919Jonathan Dixon jclass clazz = env->FindClass("android/webkit/WebViewClassic"); 132757ae1393d3097edada2640b40c895396b69cc919Jonathan Dixon ALOG_ASSERT(clazz, "Unable to find class android/webkit/WebViewClassic"); 13288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project gWebViewField = env->GetFieldID(clazz, "mNativeClass", "I"); 132957ae1393d3097edada2640b40c895396b69cc919Jonathan Dixon ALOG_ASSERT(gWebViewField, "Unable to find android/webkit/WebViewClassic.mNativeClass"); 1330bf3f67c4fcfd68df256e5c001c67969997a63e28Steve Block env->DeleteLocalRef(clazz); 13318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 133257ae1393d3097edada2640b40c895396b69cc919Jonathan Dixon return jniRegisterNativeMethods(env, "android/webkit/WebViewClassic", gJavaWebViewMethods, NELEM(gJavaWebViewMethods)); 13338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace android 1336