OSDN Git Service

Merge "Fix crash if a plugin is destroyed before its first drawing pass." into ics-mr0
authorDerek Sollenberger <djsollen@google.com>
Thu, 13 Oct 2011 17:13:42 +0000 (10:13 -0700)
committerAndroid (Google) Code Review <android-gerrit@google.com>
Thu, 13 Oct 2011 17:13:42 +0000 (10:13 -0700)
13 files changed:
Source/WebCore/Android.mk
Source/WebCore/platform/graphics/android/GLWebViewState.cpp
Source/WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp
Source/WebCore/platform/graphics/android/ImageTexture.cpp
Source/WebCore/platform/graphics/android/ImageTexture.h
Source/WebCore/platform/graphics/android/ImagesManager.cpp [new file with mode: 0644]
Source/WebCore/platform/graphics/android/ImagesManager.h [new file with mode: 0644]
Source/WebCore/platform/graphics/android/LayerAndroid.cpp
Source/WebCore/platform/graphics/android/TilesManager.cpp
Source/WebCore/platform/graphics/android/TilesManager.h
Source/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.cpp
Source/WebKit/android/jni/ViewStateSerializer.cpp
Source/WebKit/android/jni/WebCoreFrameBridge.cpp

index 075dd71..5df4d93 100644 (file)
@@ -656,6 +656,7 @@ LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) \
        platform/graphics/android/ImageAndroid.cpp \
        platform/graphics/android/ImageBufferAndroid.cpp \
        platform/graphics/android/ImageSourceAndroid.cpp \
+       platform/graphics/android/ImagesManager.cpp \
        platform/graphics/android/ImageTexture.cpp \
        platform/graphics/android/Layer.cpp \
        platform/graphics/android/LayerAndroid.cpp \
index b096c20..efcf877 100644 (file)
@@ -526,7 +526,7 @@ bool GLWebViewState::drawGL(IntRect& rect, SkRect& viewport, IntRect* invalRect,
     SkSafeUnref(baseLayer);
 #ifdef DEBUG
     TilesManager::instance()->getTilesTracker()->showTrackTextures();
-    TilesManager::instance()->showImages();
+    ImagesManager::instance()->showImages();
 #endif
     return ret;
 }
index eadac6b..89f96d8 100644 (file)
@@ -24,6 +24,7 @@
 #include "FloatRect.h"
 #include "GraphicsContext.h"
 #include "Image.h"
+#include "ImagesManager.h"
 #include "Layer.h"
 #include "Length.h"
 #include "MediaLayer.h"
index 7e71740..814373c 100644 (file)
 #include "SkDevice.h"
 #include "TilesManager.h"
 
-#ifdef DEBUG
-
 #include <cutils/log.h>
 #include <wtf/CurrentTime.h>
 #include <wtf/text/CString.h>
 
+#undef XLOGC
+#define XLOGC(...) android_printLog(ANDROID_LOG_DEBUG, "ImageTexture", __VA_ARGS__)
+
+#ifdef DEBUG
+
 #undef XLOG
 #define XLOG(...) android_printLog(ANDROID_LOG_DEBUG, "ImageTexture", __VA_ARGS__)
 
@@ -84,7 +87,7 @@ ImageTexture::~ImageTexture()
     delete m_image;
 }
 
-void ImageTexture::prepare()
+void ImageTexture::prepareGL()
 {
     if (m_textureId)
         return;
@@ -93,7 +96,7 @@ void ImageTexture::prepare()
     GLUtils::createTextureWithBitmap(m_textureId, *m_image);
 }
 
-void ImageTexture::draw(LayerAndroid* layer)
+void ImageTexture::drawGL(LayerAndroid* layer)
 {
     if (!layer)
         return;
@@ -112,6 +115,11 @@ void ImageTexture::draw(LayerAndroid* layer)
                                                       layer->drawOpacity(), true);
 }
 
+void ImageTexture::drawCanvas(SkCanvas* canvas, SkRect& rect)
+{
+    canvas->drawBitmapRect(*m_image, 0, rect);
+}
+
 void ImageTexture::release()
 {
     if (m_refCount >= 1)
@@ -122,7 +130,8 @@ void ImageTexture::release()
 
 void ImageTexture::deleteTexture()
 {
-   glDeleteTextures(1, &m_textureId);
+   if (m_textureId)
+       glDeleteTextures(1, &m_textureId);
 }
 
 } // namespace WebCore
index c2ea77c..18ff7ef 100644 (file)
@@ -63,9 +63,9 @@ public:
     ImageTexture(SkBitmapRef* img);
     virtual ~ImageTexture();
 
-    void prepare();
-    void draw(LayerAndroid* painter);
-    void deleteTexture();
+    void prepareGL();
+    void drawGL(LayerAndroid* painter);
+    void drawCanvas(SkCanvas*, SkRect&);
     void retain() { m_refCount++; }
     void release();
     unsigned int refCount() { return m_refCount; }
@@ -74,6 +74,8 @@ public:
 
 private:
 
+    void deleteTexture();
+
     SkBitmapRef* m_imageRef;
     SkBitmap* m_image;
     GLuint m_textureId;
diff --git a/Source/WebCore/platform/graphics/android/ImagesManager.cpp b/Source/WebCore/platform/graphics/android/ImagesManager.cpp
new file mode 100644 (file)
index 0000000..3518832
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * 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 "ImagesManager.h"
+
+#include "ImageTexture.h"
+
+#include <cutils/log.h>
+#include <wtf/CurrentTime.h>
+#include <wtf/text/CString.h>
+
+#undef XLOGC
+#define XLOGC(...) android_printLog(ANDROID_LOG_DEBUG, "ImagesManager", __VA_ARGS__)
+
+#ifdef DEBUG
+
+#undef XLOG
+#define XLOG(...) android_printLog(ANDROID_LOG_DEBUG, "ImagesManager", __VA_ARGS__)
+
+#else
+
+#undef XLOG
+#define XLOG(...)
+
+#endif // DEBUG
+
+namespace WebCore {
+
+ImagesManager* ImagesManager::instance()
+{
+    if (!gInstance)
+        gInstance = new ImagesManager();
+
+    return gInstance;
+}
+
+ImagesManager* ImagesManager::gInstance = 0;
+
+void ImagesManager::addImage(SkBitmapRef* imgRef)
+{
+    if (!imgRef)
+        return;
+
+    android::Mutex::Autolock lock(m_imagesLock);
+    if (!m_images.contains(imgRef))
+        m_images.set(imgRef, new ImageTexture(imgRef));
+}
+
+void ImagesManager::removeImage(SkBitmapRef* imgRef)
+{
+    android::Mutex::Autolock lock(m_imagesLock);
+    if (!m_images.contains(imgRef))
+        return;
+
+    ImageTexture* image = m_images.get(imgRef);
+    image->release();
+
+    if (!image->refCount()) {
+        m_images.remove(imgRef);
+        delete image;
+    }
+}
+
+void ImagesManager::showImages()
+{
+    XLOGC("We have %d images", m_images.size());
+    HashMap<SkBitmapRef*, ImageTexture*>::iterator end = m_images.end();
+    int i = 0;
+    for (HashMap<SkBitmapRef*, ImageTexture*>::iterator it = m_images.begin(); it != end; ++it) {
+        XLOGC("Image %x (%d/%d) has %d references", it->first, i,
+              m_images.size(), it->second->refCount());
+        i++;
+    }
+}
+
+ImageTexture* ImagesManager::getTextureForImage(SkBitmapRef* img, bool retain)
+{
+    android::Mutex::Autolock lock(m_imagesLock);
+    ImageTexture* image = m_images.get(img);
+    if (retain && image)
+        image->retain();
+    return image;
+}
+
+} // namespace WebCore
diff --git a/Source/WebCore/platform/graphics/android/ImagesManager.h b/Source/WebCore/platform/graphics/android/ImagesManager.h
new file mode 100644 (file)
index 0000000..1b5d322
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * 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.
+ */
+
+#ifndef ImagesManager_h
+#define ImagesManager_h
+
+#include "HashMap.h"
+#include "SkBitmap.h"
+#include "SkBitmapRef.h"
+#include "SkRefCnt.h"
+
+namespace WebCore {
+
+class ImageTexture;
+
+class ImagesManager {
+public:
+    static ImagesManager* instance();
+
+    void addImage(SkBitmapRef* img);
+    void removeImage(SkBitmapRef* img);
+    ImageTexture* getTextureForImage(SkBitmapRef* img, bool retain = true);
+    void showImages();
+
+private:
+    ImagesManager() {}
+
+    static ImagesManager* gInstance;
+
+    android::Mutex m_imagesLock;
+    HashMap<SkBitmapRef*, ImageTexture*> m_images;
+};
+
+} // namespace WebCore
+
+#endif // ImagesManager
index 91c44c6..4162e0b 100644 (file)
@@ -7,6 +7,7 @@
 #include "ClassTracker.h"
 #include "DrawExtra.h"
 #include "GLUtils.h"
+#include "ImagesManager.h"
 #include "MediaLayer.h"
 #include "PaintedSurface.h"
 #include "ParseCanvas.h"
@@ -16,6 +17,7 @@
 #include "SkPaint.h"
 #include "SkPicture.h"
 #include "TilesManager.h"
+
 #include <wtf/CurrentTime.h>
 #include <math.h>
 
@@ -102,7 +104,7 @@ LayerAndroid::LayerAndroid(const LayerAndroid& layer) : Layer(layer),
     m_isFixed = layer.m_isFixed;
     m_imageRef = layer.m_imageRef;
     if (m_imageRef)
-        TilesManager::instance()->addImage(m_imageRef);
+        ImagesManager::instance()->addImage(m_imageRef);
     m_renderLayerPos = layer.m_renderLayerPos;
     m_transform = layer.m_transform;
     m_backfaceVisibility = layer.m_backfaceVisibility;
@@ -177,7 +179,7 @@ LayerAndroid::LayerAndroid(SkPicture* picture) : Layer(),
 LayerAndroid::~LayerAndroid()
 {
     if (m_imageTexture)
-        TilesManager::instance()->removeImage(m_imageTexture->imageRef());
+        ImagesManager::instance()->removeImage(m_imageTexture->imageRef());
     delete m_extra;
     SkSafeUnref(m_recordingPicture);
     m_animations.clear();
@@ -667,7 +669,7 @@ void LayerAndroid::setContentsImage(SkBitmapRef* img)
     if (!img)
         return;
 
-    TilesManager::instance()->addImage(img);
+    ImagesManager::instance()->addImage(img);
 }
 
 bool LayerAndroid::needsTexture()
@@ -814,7 +816,7 @@ void LayerAndroid::createTexture()
 
     if (m_imageRef) {
         if (!m_imageTexture) {
-            m_imageTexture = TilesManager::instance()->getTextureForImage(m_imageRef);
+            m_imageTexture = ImagesManager::instance()->getTextureForImage(m_imageRef);
             m_dirtyRegion.setEmpty();
         }
         if (m_texture) {
@@ -876,7 +878,7 @@ void LayerAndroid::prepare(GLWebViewState* glWebViewState)
         m_texture->prepare(glWebViewState);
 
     if (m_imageTexture)
-        m_imageTexture->prepare();
+        m_imageTexture->prepareGL();
 }
 
 bool LayerAndroid::drawGL(GLWebViewState* glWebViewState, SkMatrix& matrix)
@@ -891,7 +893,7 @@ bool LayerAndroid::drawGL(GLWebViewState* glWebViewState, SkMatrix& matrix)
         askScreenUpdate |= m_texture->draw();
 
     if (m_imageTexture)
-        m_imageTexture->draw(this);
+        m_imageTexture->drawGL(this);
 
     // When the layer is dirty, the UI thread should be notified to redraw.
     askScreenUpdate |= drawChildrenGL(glWebViewState, matrix);
@@ -977,6 +979,17 @@ void LayerAndroid::onDraw(SkCanvas* canvas, SkScalar opacity)
     if (canvasOpacity < 255)
         canvas->setDrawFilter(new OpacityDrawFilter(canvasOpacity));
 
+    if (m_imageRef) {
+        if (!m_imageTexture) {
+            m_imageTexture = ImagesManager::instance()->getTextureForImage(m_imageRef);
+            m_dirtyRegion.setEmpty();
+        }
+        if (m_imageTexture) {
+            SkRect dest;
+            dest.set(0, 0, getSize().width(), getSize().height());
+            m_imageTexture->drawCanvas(canvas, dest);
+        }
+    }
     contentDraw(canvas);
 }
 
index 2d0cc7f..74cc764 100644 (file)
@@ -429,52 +429,6 @@ void TilesManager::unregisterGLWebViewState(GLWebViewState* state)
     transferQueue()->discardQueue();
 }
 
-void TilesManager::addImage(SkBitmapRef* imgRef)
-{
-    if (!imgRef)
-        return;
-
-    android::Mutex::Autolock lock(m_imagesLock);
-    if (!m_images.contains(imgRef))
-        m_images.set(imgRef, new ImageTexture(imgRef));
-}
-
-void TilesManager::removeImage(SkBitmapRef* imgRef)
-{
-    android::Mutex::Autolock lock(m_imagesLock);
-    if (!m_images.contains(imgRef))
-        return;
-
-    ImageTexture* image = m_images.get(imgRef);
-    image->release();
-
-    if (!image->refCount()) {
-        m_images.remove(imgRef);
-        delete image;
-    }
-}
-
-void TilesManager::showImages()
-{
-    XLOGC("We have %d images", m_images.size());
-    HashMap<SkBitmapRef*, ImageTexture*>::iterator end = m_images.end();
-    int i = 0;
-    for (HashMap<SkBitmapRef*, ImageTexture*>::iterator it = m_images.begin(); it != end; ++it) {
-        XLOGC("Image %x (%d/%d) has %d references", it->first, i,
-              m_images.size(), it->second->refCount());
-        i++;
-    }
-}
-
-ImageTexture* TilesManager::getTextureForImage(SkBitmapRef* img, bool retain)
-{
-    android::Mutex::Autolock lock(m_imagesLock);
-    ImageTexture* image = m_images.get(img);
-    if (retain && image)
-        image->retain();
-    return image;
-}
-
 TilesManager* TilesManager::instance()
 {
     if (!gInstance) {
index b7d6aa6..4daecff 100644 (file)
@@ -179,10 +179,6 @@ public:
     {
         return m_drawGLCount;
     }
-    void addImage(SkBitmapRef* img);
-    void removeImage(SkBitmapRef* img);
-    ImageTexture* getTextureForImage(SkBitmapRef* img, bool retain = true);
-    void showImages();
 
 private:
     TilesManager();
@@ -215,7 +211,6 @@ private:
 
     android::Mutex m_texturesLock;
     android::Mutex m_generatorLock;
-    android::Mutex m_imagesLock;
     android::Condition m_generatorReadyCond;
 
     static TilesManager* gInstance;
@@ -228,8 +223,6 @@ private:
     TilesProfiler m_profiler;
     TilesTracker m_tilesTracker;
     unsigned long long m_drawGLCount;
-
-    HashMap<SkBitmapRef*, ImageTexture*> m_images;
 };
 
 } // namespace WebCore
index 3134a44..0be31eb 100644 (file)
@@ -919,9 +919,13 @@ void FrameLoaderClientAndroid::transitionToCommittedFromCachedFrame(WebCore::Cac
 #ifdef ANDROID_META_SUPPORT
    platformData->restoreMetadata(m_frame->settings());
 #endif
+
+#if ENABLE(ANDROID_OVERFLOW_SCROLL)
+#else
    WebViewCore* webViewCore = WebViewCore::getWebViewCore(m_frame->view());
 
    webViewCore->clearContent();
+#endif
 
    m_webFrame->transitionToCommitted(m_frame);
 }
@@ -956,7 +960,12 @@ void FrameLoaderClientAndroid::transitionToCommittedForNewPage() {
 
     // Create a new WebFrameView for the new FrameView
     WebFrameView* newFrameView = new WebFrameView(m_frame->view(), webViewCore);
+
+#if ENABLE(ANDROID_OVERFLOW_SCROLL)
+#else
     webViewCore->clearContent();
+#endif
+
     newFrameView->setLocation(bounds.x(), bounds.y());
     newFrameView->setSize(bounds.width(), bounds.height());
     newFrameView->setVisibleSize(visBounds.width(), visBounds.height());
index c896637..93f4375 100644 (file)
@@ -27,6 +27,7 @@
 
 #include "BaseLayerAndroid.h"
 #include "CreateJavaOutputStreamAdaptor.h"
+#include "ImagesManager.h"
 #include "Layer.h"
 #include "LayerAndroid.h"
 #include "PictureSet.h"
@@ -302,7 +303,7 @@ void serializeLayer(LayerAndroid* layer, SkWStream* stream)
         SkFlattenableWriteBuffer buffer(1024);
         buffer.setFlags(SkFlattenableWriteBuffer::kCrossProcess_Flag);
         ImageTexture* imagetexture =
-                TilesManager::instance()->getTextureForImage(layer->m_imageRef, false);
+                ImagesManager::instance()->getTextureForImage(layer->m_imageRef, false);
         if (imagetexture && imagetexture->bitmap())
             imagetexture->bitmap()->flatten(buffer);
         stream->write32(buffer.size());
index 7f791ea..bb28d28 100644 (file)
@@ -983,7 +983,7 @@ WebFrame::didReceiveAuthenticationChallenge(WebUrlLoaderClient* client, const st
 }
 
 void
-WebFrame::reportSslCertError(WebUrlLoaderClient* client, int cert_error, const std::string& cert, const std::string& url)
+WebFrame::reportSslCertError(WebUrlLoaderClient* client, int error, const std::string& cert, const std::string& url)
 {
 #ifdef ANDROID_INSTRUMENT
     TimeCounterAuto counter(TimeCounter::JavaCallbackTimeCounter);
@@ -994,16 +994,14 @@ WebFrame::reportSslCertError(WebUrlLoaderClient* client, int cert_error, const s
         return;
     int jHandle = reinterpret_cast<int>(client);
 
+    // Don't copy the null terminator.
     int len = cert.length();
-    jbyteArray jCert = env->NewByteArray(len);
-    jbyte* bytes = env->GetByteArrayElements(jCert, NULL);
-    cert.copy(reinterpret_cast<char*>(bytes), len);
+    ScopedLocalRef<jbyteArray> jCert(env, env->NewByteArray(len));
+    env->SetByteArrayRegion(jCert.get(), 0, len, reinterpret_cast<const jbyte*>(cert.c_str()));
 
-    jstring jUrl = env->NewStringUTF(url.c_str());
+    ScopedLocalRef<jstring> jUrl(env, env->NewStringUTF(url.c_str()));
 
-    env->CallVoidMethod(javaFrame.get(), mJavaFrame->mReportSslCertError, jHandle, cert_error, jCert, jUrl);
-    env->DeleteLocalRef(jCert);
-    env->DeleteLocalRef(jUrl);
+    env->CallVoidMethod(javaFrame.get(), mJavaFrame->mReportSslCertError, jHandle, error, jCert.get(), jUrl.get());
     checkException(env);
 }
 
@@ -1057,12 +1055,10 @@ WebFrame::didReceiveData(const char* data, int size) {
     if (!javaFrame.get())
         return;
 
-    jbyteArray jData = env->NewByteArray(size);
-    jbyte* bytes = env->GetByteArrayElements(jData, NULL);
-    memcpy(reinterpret_cast<char*>(bytes), data, size);
+    ScopedLocalRef<jbyteArray> jData(env, env->NewByteArray(size));
+    env->SetByteArrayRegion(jData.get(), 0, size, reinterpret_cast<const jbyte*>(data));
 
-    env->CallVoidMethod(javaFrame.get(), mJavaFrame->mDidReceiveData, jData, size);
-    env->DeleteLocalRef(jData);
+    env->CallVoidMethod(javaFrame.get(), mJavaFrame->mDidReceiveData, jData.get(), size);
     checkException(env);
 }
 
@@ -1091,13 +1087,11 @@ void WebFrame::setCertificate(const std::string& cert)
         return;
 
     int len = cert.length();
-    jbyteArray jCert = env->NewByteArray(len);
-    jbyte* bytes = env->GetByteArrayElements(jCert, NULL);
-    cert.copy(reinterpret_cast<char*>(bytes), len);
+    ScopedLocalRef<jbyteArray> jCert(env, env->NewByteArray(len));
+    env->SetByteArrayRegion(jCert.get(), 0, len, reinterpret_cast<const jbyte*>(cert.c_str()));
 
-    env->CallVoidMethod(javaFrame.get(), mJavaFrame->mSetCertificate, jCert);
+    env->CallVoidMethod(javaFrame.get(), mJavaFrame->mSetCertificate, jCert.get());
 
-    env->DeleteLocalRef(jCert);
     checkException(env);
 }
 #endif // USE(CHROME_NETWORK_STACK)