diff options
author | Chris Craik <ccraik@google.com> | 2011-07-28 11:32:08 -0700 |
---|---|---|
committer | Chris Craik <ccraik@google.com> | 2011-07-28 13:27:01 -0700 |
commit | 96eef4d75f8a709cc252a69c4e8cb5bd4251187e (patch) | |
tree | 08d0384ef4b09ca1391d414b1463c7df4e5163b4 /Source | |
parent | 14a561b2c1a0d30c36751ea756c773d70c9c4d76 (diff) | |
download | external_webkit-96eef4d75f8a709cc252a69c4e8cb5bd4251187e.zip external_webkit-96eef4d75f8a709cc252a69c4e8cb5bd4251187e.tar.gz external_webkit-96eef4d75f8a709cc252a69c4e8cb5bd4251187e.tar.bz2 |
added pageswap callback from drawGL to WebView
bug:5008210
When setting a new base layer, WebView can signal that it wants to have it's
pageSwapCallback triggered. This is only done upon request, currently whenever
the WebTextView is being displayed so that it can be repositioned upon pageswap.
Depends on the following frameworks/base change:
https://android-git.corp.google.com/g/#change,124607
Change-Id: Id99c2d5a15cdb4317802a92cedae16a9e0aebc8d
Diffstat (limited to 'Source')
5 files changed, 41 insertions, 13 deletions
diff --git a/Source/WebCore/platform/graphics/android/BaseLayerAndroid.cpp b/Source/WebCore/platform/graphics/android/BaseLayerAndroid.cpp index a09eb35..014fa40 100644 --- a/Source/WebCore/platform/graphics/android/BaseLayerAndroid.cpp +++ b/Source/WebCore/platform/graphics/android/BaseLayerAndroid.cpp @@ -112,7 +112,8 @@ void BaseLayerAndroid::drawCanvas(SkCanvas* canvas) } #if USE(ACCELERATED_COMPOSITING) -bool BaseLayerAndroid::drawBasePictureInGL(SkRect& viewport, float scale, double currentTime) +bool BaseLayerAndroid::drawBasePictureInGL(SkRect& viewport, float scale, + double currentTime, bool* pagesSwapped) { if (!m_glWebViewState) return false; @@ -249,6 +250,8 @@ bool BaseLayerAndroid::drawBasePictureInGL(SkRect& viewport, float scale, double m_glWebViewState->setCurrentScale(scale); m_glWebViewState->swapPages(); m_glWebViewState->unlockBaseLayerUpdate(); + if (pagesSwapped) + *pagesSwapped = true; } m_glWebViewState->paintExtras(); @@ -259,7 +262,8 @@ bool BaseLayerAndroid::drawBasePictureInGL(SkRect& viewport, float scale, double bool BaseLayerAndroid::drawGL(LayerAndroid* compositedRoot, IntRect& viewRect, SkRect& visibleRect, IntRect& webViewRect, int titleBarHeight, - IntRect& screenClip, float scale, SkColor color) + IntRect& screenClip, float scale, + bool* pagesSwapped, SkColor color) { bool needsRedraw = false; #if USE(ACCELERATED_COMPOSITING) @@ -299,7 +303,8 @@ bool BaseLayerAndroid::drawGL(LayerAndroid* compositedRoot, shader->resetBlending(); double currentTime = WTF::currentTime(); - needsRedraw = drawBasePictureInGL(visibleRect, scale, currentTime); + needsRedraw = drawBasePictureInGL(visibleRect, scale, currentTime, + pagesSwapped); bool goingDown = m_previousVisible.fTop - visibleRect.fTop <= 0; bool goingLeft = m_previousVisible.fLeft - visibleRect.fLeft >= 0; m_glWebViewState->setDirection(goingDown, goingLeft); diff --git a/Source/WebCore/platform/graphics/android/BaseLayerAndroid.h b/Source/WebCore/platform/graphics/android/BaseLayerAndroid.h index 29ecf57..62aabb6 100644 --- a/Source/WebCore/platform/graphics/android/BaseLayerAndroid.h +++ b/Source/WebCore/platform/graphics/android/BaseLayerAndroid.h @@ -57,11 +57,12 @@ public: bool drawGL(LayerAndroid* compositedRoot, IntRect& rect, SkRect& viewport, IntRect& webViewRect, int titleBarHeight, IntRect& screenClip, - float scale, SkColor color = SK_ColorWHITE); + float scale, bool* pagesSwapped, SkColor color = SK_ColorWHITE); void swapExtra(BaseLayerAndroid* base) { m_extra.swap(base->m_extra); } private: #if USE(ACCELERATED_COMPOSITING) - bool drawBasePictureInGL(SkRect& viewport, float scale, double currentTime); + bool drawBasePictureInGL(SkRect& viewport, float scale, double currentTime, + bool* pagesSwapped); GLWebViewState* m_glWebViewState; android::Mutex m_drawLock; diff --git a/Source/WebCore/platform/graphics/android/GLWebViewState.cpp b/Source/WebCore/platform/graphics/android/GLWebViewState.cpp index 2e379bc..07dda03 100644 --- a/Source/WebCore/platform/graphics/android/GLWebViewState.cpp +++ b/Source/WebCore/platform/graphics/android/GLWebViewState.cpp @@ -501,7 +501,8 @@ void GLWebViewState::resetLayersDirtyArea() bool GLWebViewState::drawGL(IntRect& rect, SkRect& viewport, IntRect* invalRect, IntRect& webViewRect, int titleBarHeight, - IntRect& clip, float scale, SkColor color) + IntRect& clip, float scale, bool* pagesSwapped, + SkColor color) { glFinish(); TilesManager::instance()->registerGLWebViewState(this); @@ -548,7 +549,8 @@ bool GLWebViewState::drawGL(IntRect& rect, SkRect& viewport, IntRect* invalRect, TilesManager::instance()->cleanupTilesTextures(); } - bool ret = baseLayer->drawGL(compositedRoot, rect, viewport, webViewRect, titleBarHeight, clip, scale, color); + bool ret = baseLayer->drawGL(compositedRoot, rect, viewport, webViewRect, + titleBarHeight, clip, scale, pagesSwapped, color); SkSafeRef(compositedRoot); SkSafeUnref(m_previouslyUsedRoot); m_previouslyUsedRoot = compositedRoot; diff --git a/Source/WebCore/platform/graphics/android/GLWebViewState.h b/Source/WebCore/platform/graphics/android/GLWebViewState.h index 6834974..4f8d4fe 100644 --- a/Source/WebCore/platform/graphics/android/GLWebViewState.h +++ b/Source/WebCore/platform/graphics/android/GLWebViewState.h @@ -220,7 +220,8 @@ public: bool drawGL(IntRect& rect, SkRect& viewport, IntRect* invalRect, IntRect& webViewRect, int titleBarHeight, - IntRect& clip, float scale, SkColor color = SK_ColorWHITE); + IntRect& clip, float scale, bool* pagesSwapped, + SkColor color = SK_ColorWHITE); void setBackgroundColor(SkColor color) { m_backgroundColor = color; } SkColor getBackgroundColor() { return m_backgroundColor; } diff --git a/Source/WebKit/android/nav/WebView.cpp b/Source/WebKit/android/nav/WebView.cpp index 6a95d33..77ac2ae 100644 --- a/Source/WebKit/android/nav/WebView.cpp +++ b/Source/WebKit/android/nav/WebView.cpp @@ -126,6 +126,7 @@ struct JavaGlue { jmethodID m_viewInvalidate; jmethodID m_viewInvalidateRect; jmethodID m_postInvalidateDelayed; + jmethodID m_pageSwapCallback; jmethodID m_inFullScreenMode; jfieldID m_rectLeft; jfieldID m_rectTop; @@ -162,6 +163,7 @@ WebView(JNIEnv* env, jobject javaWebView, int viewImpl, WTF::String drawableDir, m_javaGlue.m_viewInvalidateRect = GetJMethod(env, clazz, "viewInvalidate", "(IIII)V"); m_javaGlue.m_postInvalidateDelayed = GetJMethod(env, clazz, "viewInvalidateDelayed", "(JIIII)V"); + m_javaGlue.m_pageSwapCallback = GetJMethod(env, clazz, "pageSwapCallback", "()V"); m_javaGlue.m_inFullScreenMode = GetJMethod(env, clazz, "inFullScreenMode", "()Z"); env->DeleteLocalRef(clazz); @@ -198,6 +200,7 @@ WebView(JNIEnv* env, jobject javaWebView, int viewImpl, WTF::String drawableDir, m_buttonSkin = new RenderSkinButton(am, drawableDir); #if USE(ACCELERATED_COMPOSITING) m_glWebViewState = 0; + m_pageSwapCallbackRegistered = false; #endif } @@ -513,8 +516,20 @@ bool drawGL(WebCore::IntRect& viewRect, WebCore::IntRect* invalRect, WebCore::In // once the correct scale is set if (!visibleRect.hasValidCoordinates()) return false; + bool pagesSwapped = false; bool ret = m_glWebViewState->drawGL(viewRect, visibleRect, invalRect, - webViewRect, titleBarHeight, clip, scale); + webViewRect, titleBarHeight, clip, scale, + &pagesSwapped); + if (m_pageSwapCallbackRegistered && pagesSwapped) { + m_pageSwapCallbackRegistered = false; + LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!"); + JNIEnv* env = JSC::Bindings::getJNIEnv(); + AutoJObject javaObject = m_javaGlue.object(env); + if (javaObject.get()) { + env->CallVoidMethod(javaObject.get(), m_javaGlue.m_pageSwapCallback); + checkException(env); + } + } if (ret || m_glWebViewState->currentPictureCounter() != pic) return true; #endif @@ -1435,12 +1450,13 @@ static void copyScrollPositionRecursive(const LayerAndroid* from, #endif void setBaseLayer(BaseLayerAndroid* layer, SkRegion& inval, bool showVisualIndicator, - bool isPictureAfterFirstLayout) + bool isPictureAfterFirstLayout, bool registerPageSwapCallback) { #if USE(ACCELERATED_COMPOSITING) if (m_glWebViewState) m_glWebViewState->setBaseLayer(layer, inval, showVisualIndicator, isPictureAfterFirstLayout); + m_pageSwapCallbackRegistered |= registerPageSwapCallback; #endif #if ENABLE(ANDROID_OVERFLOW_SCROLL) @@ -1513,6 +1529,7 @@ private: // local state for WebView Functor* m_glDrawFunctor; #if USE(ACCELERATED_COMPOSITING) GLWebViewState* m_glWebViewState; + bool m_pageSwapCallbackRegistered; #endif const RenderSkinButton* m_buttonSkin; }; // end of WebView class @@ -1875,14 +1892,16 @@ static bool nativeEvaluateLayersAnimations(JNIEnv *env, jobject obj) static void nativeSetBaseLayer(JNIEnv *env, jobject obj, jint layer, jobject inval, jboolean showVisualIndicator, - jboolean isPictureAfterFirstLayout) + jboolean isPictureAfterFirstLayout, + jboolean registerPageSwapCallback) { BaseLayerAndroid* layerImpl = reinterpret_cast<BaseLayerAndroid*>(layer); SkRegion invalRegion; if (inval) invalRegion = *GraphicsJNI::getNativeRegion(env, inval); GET_NATIVE_VIEW(env, obj)->setBaseLayer(layerImpl, invalRegion, showVisualIndicator, - isPictureAfterFirstLayout); + isPictureAfterFirstLayout, + registerPageSwapCallback); } static BaseLayerAndroid* nativeGetBaseLayer(JNIEnv *env, jobject obj) @@ -2748,7 +2767,7 @@ static JNINativeMethod gJavaWebViewMethods[] = { (void*) nativeSetFindIsUp }, { "nativeSetHeightCanMeasure", "(Z)V", (void*) nativeSetHeightCanMeasure }, - { "nativeSetBaseLayer", "(ILandroid/graphics/Region;ZZ)V", + { "nativeSetBaseLayer", "(ILandroid/graphics/Region;ZZZ)V", (void*) nativeSetBaseLayer }, { "nativeGetBaseLayer", "()I", (void*) nativeGetBaseLayer }, |