diff options
author | John Reck <jreck@google.com> | 2011-06-02 16:04:42 -0700 |
---|---|---|
committer | John Reck <jreck@google.com> | 2011-06-03 13:09:55 -0700 |
commit | 4212fae38ffee2bbb657dd19e4ae8b7c735f4953 (patch) | |
tree | 0ca18e2fb4fcdb0a84e858994d3c816db42ea531 /Source | |
parent | d615dff3cad080859e4d5d6075c9e98178ae8bd9 (diff) | |
download | external_webkit-4212fae38ffee2bbb657dd19e4ae8b7c735f4953.zip external_webkit-4212fae38ffee2bbb657dd19e4ae8b7c735f4953.tar.gz external_webkit-4212fae38ffee2bbb657dd19e4ae8b7c735f4953.tar.bz2 |
Initial support for serializing the view state
Serializes only the base layer currently
Change-Id: I5cff216a4fc1b08efe3a7955c616b91114f6bf0b
Diffstat (limited to 'Source')
-rw-r--r-- | Source/WebCore/platform/graphics/android/BaseLayerAndroid.h | 1 | ||||
-rw-r--r-- | Source/WebKit/Android.mk | 1 | ||||
-rw-r--r-- | Source/WebKit/android/jni/PictureSet.cpp | 16 | ||||
-rw-r--r-- | Source/WebKit/android/jni/PictureSet.h | 1 | ||||
-rw-r--r-- | Source/WebKit/android/jni/ViewStateSerializer.cpp | 97 | ||||
-rw-r--r-- | Source/WebKit/android/jni/WebCoreJniOnLoad.cpp | 2 | ||||
-rw-r--r-- | Source/WebKit/android/nav/WebView.cpp | 11 |
7 files changed, 129 insertions, 0 deletions
diff --git a/Source/WebCore/platform/graphics/android/BaseLayerAndroid.h b/Source/WebCore/platform/graphics/android/BaseLayerAndroid.h index 38e7e47..e6680b5 100644 --- a/Source/WebCore/platform/graphics/android/BaseLayerAndroid.h +++ b/Source/WebCore/platform/graphics/android/BaseLayerAndroid.h @@ -44,6 +44,7 @@ public: #if USE(ACCELERATED_COMPOSITING) void setGLWebViewState(GLWebViewState* infos) { m_glWebViewState = infos; } void setBackgroundColor(Color& color) { m_color = color; } + Color getBackgroundColor() { return m_color; } #endif void setContent(const android::PictureSet& src); void setExtra(SkPicture& extra); diff --git a/Source/WebKit/Android.mk b/Source/WebKit/Android.mk index 5998227..d02557e 100644 --- a/Source/WebKit/Android.mk +++ b/Source/WebKit/Android.mk @@ -83,6 +83,7 @@ LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) \ android/jni/WebStorage.cpp \ android/jni/WebSettings.cpp \ android/jni/WebViewCore.cpp \ + android/jni/ViewStateSerializer.cpp \ \ android/nav/CacheBuilder.cpp \ android/nav/CachedColor.cpp \ diff --git a/Source/WebKit/android/jni/PictureSet.cpp b/Source/WebKit/android/jni/PictureSet.cpp index e4bd89c..181256c 100644 --- a/Source/WebKit/android/jni/PictureSet.cpp +++ b/Source/WebKit/android/jni/PictureSet.cpp @@ -81,6 +81,22 @@ PictureSet::PictureSet() mBaseArea = mAdditionalArea = 0; } +PictureSet::PictureSet(SkPicture* picture) +{ + if (!picture) + return; + Pictures pictureAndBounds; + pictureAndBounds.mPicture = picture; + SkSafeRef(pictureAndBounds.mPicture); + pictureAndBounds.mEmpty = false; + pictureAndBounds.mArea.setRect(0, 0, picture->width(), picture->height()); + pictureAndBounds.mSplit = false; + pictureAndBounds.mBase = true; + pictureAndBounds.mElapsed = 0; + pictureAndBounds.mWroteElapsed = false; + mPictures.append(pictureAndBounds); +} + PictureSet::~PictureSet() { clear(); diff --git a/Source/WebKit/android/jni/PictureSet.h b/Source/WebKit/android/jni/PictureSet.h index 907fb92..b04337c 100644 --- a/Source/WebKit/android/jni/PictureSet.h +++ b/Source/WebKit/android/jni/PictureSet.h @@ -54,6 +54,7 @@ namespace android { public: PictureSet(); PictureSet(const PictureSet& src) { set(src); } + PictureSet(SkPicture* picture); virtual ~PictureSet(); void add(const SkRegion& area, SkPicture* picture, uint32_t elapsed, bool split) diff --git a/Source/WebKit/android/jni/ViewStateSerializer.cpp b/Source/WebKit/android/jni/ViewStateSerializer.cpp new file mode 100644 index 0000000..c780e07 --- /dev/null +++ b/Source/WebKit/android/jni/ViewStateSerializer.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2011, The Android Open Source Project + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" + +#include "BaseLayerAndroid.h" +#include "CreateJavaOutputStreamAdaptor.h" +#include "PictureSet.h" +#include "SkPicture.h" + +#include <JNIUtility.h> +#include <JNIHelp.h> +#include <jni.h> + +namespace android { + +static bool nativeSerializeViewState(JNIEnv* env, jobject, jint jbaseLayer, + jobject jstream, jbyteArray jstorage) +{ + BaseLayerAndroid* baseLayer = (BaseLayerAndroid*) jbaseLayer; + if (!baseLayer) + return false; + + SkWStream *stream = CreateJavaOutputStreamAdaptor(env, jstream, jstorage); +#if USE(ACCELERATED_COMPOSITING) + stream->write32(baseLayer->getBackgroundColor().rgb()); +#else + stream->write32(0); +#endif + SkPicture picture; + PictureSet* content = baseLayer->content(); + baseLayer->drawCanvas(picture.beginRecording(content->width(), content->height(), + SkPicture::kUsePathBoundsForClip_RecordingFlag)); + picture.endRecording(); + if (!stream) + return false; + picture.serialize(stream); + delete stream; + return true; +} + +static BaseLayerAndroid* nativeDeserializeViewState(JNIEnv* env, jobject, jobject jstream, + jbyteArray jstorage) +{ + SkStream* stream = CreateJavaInputStreamAdaptor(env, jstream, jstorage); + if (!stream) + return 0; + BaseLayerAndroid* layer = new BaseLayerAndroid(); + Color color = stream->readU32(); +#if USE(ACCELERATED_COMPOSITING) + layer->setBackgroundColor(color); +#endif + SkPicture* picture = new SkPicture(stream); + delete stream; + layer->setContent(picture); + return layer; +} + +/* + * JNI registration + */ +static JNINativeMethod gSerializerMethods[] = { + { "nativeSerializeViewState", "(ILjava/io/OutputStream;[B)Z", + (void*) nativeSerializeViewState }, + { "nativeDeserializeViewState", "(Ljava/io/InputStream;[B)I", + (void*) nativeDeserializeViewState }, +}; + +int registerViewStateSerializer(JNIEnv* env) +{ + return jniRegisterNativeMethods(env, "android/webkit/ViewStateSerializer", + gSerializerMethods, NELEM(gSerializerMethods)); +} + +} diff --git a/Source/WebKit/android/jni/WebCoreJniOnLoad.cpp b/Source/WebKit/android/jni/WebCoreJniOnLoad.cpp index 1f264a2..e9d7bc3 100644 --- a/Source/WebKit/android/jni/WebCoreJniOnLoad.cpp +++ b/Source/WebKit/android/jni/WebCoreJniOnLoad.cpp @@ -82,6 +82,7 @@ extern int registerWebHistory(JNIEnv*); extern int registerWebIconDatabase(JNIEnv*); extern int registerWebSettings(JNIEnv*); extern int registerWebView(JNIEnv*); +extern int registerViewStateSerializer(JNIEnv*); #if ENABLE(DATABASE) extern int registerWebStorage(JNIEnv*); #endif @@ -117,6 +118,7 @@ static RegistrationMethod gWebCoreRegMethods[] = { { "WebStorage", android::registerWebStorage }, #endif { "WebView", android::registerWebView }, + { "ViewStateSerializer", android::registerViewStateSerializer }, { "GeolocationPermissions", android::registerGeolocationPermissions }, { "MockGeolocation", android::registerMockGeolocation }, #if ENABLE(VIDEO) diff --git a/Source/WebKit/android/nav/WebView.cpp b/Source/WebKit/android/nav/WebView.cpp index f56cd69..11a857e 100644 --- a/Source/WebKit/android/nav/WebView.cpp +++ b/Source/WebKit/android/nav/WebView.cpp @@ -1449,6 +1449,10 @@ Functor* getFunctor() { return m_glDrawFunctor; } +BaseLayerAndroid* getBaseLayer() { + return m_baseLayer; +} + private: // local state for WebView // private to getFrameCache(); other functions operate in a different thread CachedRoot* m_frameCacheUI; // navigation data ready for use @@ -1838,6 +1842,11 @@ static void nativeSetBaseLayer(JNIEnv *env, jobject obj, jint layer, jobject inv isPictureAfterFirstLayout); } +static BaseLayerAndroid* nativeGetBaseLayer(JNIEnv *env, jobject obj) +{ + return GET_NATIVE_VIEW(env, obj)->getBaseLayer(); +} + static void nativeReplaceBaseContent(JNIEnv *env, jobject obj, jint content) { PictureSet* set = reinterpret_cast<PictureSet*>(content); @@ -2627,6 +2636,8 @@ static JNINativeMethod gJavaWebViewMethods[] = { (void*) nativeSetHeightCanMeasure }, { "nativeSetBaseLayer", "(ILandroid/graphics/Region;ZZ)V", (void*) nativeSetBaseLayer }, + { "nativeGetBaseLayer", "()I", + (void*) nativeGetBaseLayer }, { "nativeReplaceBaseContent", "(I)V", (void*) nativeReplaceBaseContent }, { "nativeCopyBaseContentToPicture", "(Landroid/graphics/Picture;)V", |