OSDN Git Service

Initial support for serializing the view state
authorJohn Reck <jreck@google.com>
Thu, 2 Jun 2011 23:04:42 +0000 (16:04 -0700)
committerJohn Reck <jreck@google.com>
Fri, 3 Jun 2011 20:09:55 +0000 (13:09 -0700)
 Serializes only the base layer currently

Change-Id: I5cff216a4fc1b08efe3a7955c616b91114f6bf0b

Source/WebCore/platform/graphics/android/BaseLayerAndroid.h
Source/WebKit/Android.mk
Source/WebKit/android/jni/PictureSet.cpp
Source/WebKit/android/jni/PictureSet.h
Source/WebKit/android/jni/ViewStateSerializer.cpp [new file with mode: 0644]
Source/WebKit/android/jni/WebCoreJniOnLoad.cpp
Source/WebKit/android/nav/WebView.cpp

index 38e7e47..e6680b5 100644 (file)
@@ -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);
index 5998227..d02557e 100644 (file)
@@ -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 \
index e4bd89c..181256c 100644 (file)
@@ -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();
index 907fb92..b04337c 100644 (file)
@@ -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 (file)
index 0000000..c780e07
--- /dev/null
@@ -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));
+}
+
+}
index 1f264a2..e9d7bc3 100644 (file)
@@ -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)
index f56cd69..11a857e 100644 (file)
@@ -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",