OSDN Git Service

Switching from activity based full screen plugins to a view system overlay.
authorDerek Sollenberger <djsollen@google.com>
Mon, 7 Dec 2009 21:18:43 +0000 (16:18 -0500)
committerDerek Sollenberger <djsollen@google.com>
Tue, 8 Dec 2009 13:12:09 +0000 (08:12 -0500)
WebKit/Android.mk
WebKit/android/jni/PluginActivity.cpp [deleted file]
WebKit/android/jni/WebCoreJniOnLoad.cpp
WebKit/android/jni/WebViewCore.cpp
WebKit/android/jni/WebViewCore.h
WebKit/android/plugins/ANPWindowInterface.cpp
WebKit/android/plugins/android_npapi.h

index 04e223a..2f0b5d4 100644 (file)
@@ -43,7 +43,6 @@ LOCAL_SRC_FILES := \
        android/jni/JavaSharedClient.cpp \
        android/jni/MockGeolocation.cpp \
        android/jni/PictureSet.cpp \
-       android/jni/PluginActivity.cpp \
        android/jni/WebCoreFrameBridge.cpp \
        android/jni/WebCoreJni.cpp \
        android/jni/WebCoreResourceLoader.cpp \
diff --git a/WebKit/android/jni/PluginActivity.cpp b/WebKit/android/jni/PluginActivity.cpp
deleted file mode 100644 (file)
index 47e961e..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright 2009, 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.
- */
-
-#define LOG_TAG "pluginActivity"
-
-#include <config.h>
-
-#include "PluginView.h"
-#include "PluginWidgetAndroid.h"
-#include "WebCoreJni.h"
-#include "jni_utility.h"
-#include <JNIHelp.h>
-
-namespace android {
-
-
-static WebCore::PluginView* pluginViewForInstance(NPP instance) {
-    if (instance && instance->ndata)
-        return static_cast<WebCore::PluginView*>(instance->ndata);
-    return NULL;
-}
-
-//--------------------------------------------------------------------------
-// PluginActivity native methods.
-//--------------------------------------------------------------------------
-
-static jobject getWebkitPlugin(JNIEnv* env, jobject obj, jint npp)
-{
-    NPP instance = (NPP)npp;
-
-    WebCore::PluginView* pluginView = pluginViewForInstance(instance);
-    LOG_ASSERT(pluginView, "Unable to resolve the plugin using the given NPP");
-
-    PluginWidgetAndroid* pluginWidget = pluginView->platformPluginWidget();
-    LOG_ASSERT(pluginWidget, "Unable to retrieve the android specific portion of the plugin");
-
-    return pluginWidget->getJavaPluginInstance();
-}
-
-//---------------------------------------------------------
-// JNI registration
-//---------------------------------------------------------
-static JNINativeMethod gPluginActivityMethods[] = {
-    { "nativeGetWebkitPlugin", "(I)Landroid/webkit/plugin/WebkitPlugin;",
-        (void*) getWebkitPlugin }
-};
-
-
-int register_plugin_activity(JNIEnv* env)
-{
-    return jniRegisterNativeMethods(env, "android/webkit/PluginActivity",
-            gPluginActivityMethods, NELEM(gPluginActivityMethods));
-}
-
-} /* namespace android */
index 6711e6b..616526b 100644 (file)
@@ -88,7 +88,6 @@ extern int register_mock_geolocation(JNIEnv*);
 #if ENABLE(VIDEO)
 extern int register_mediaplayer(JNIEnv*);
 #endif
-extern int register_plugin_activity(JNIEnv*);
 
 }
 
@@ -115,7 +114,6 @@ static RegistrationMethod gWebCoreRegMethods[] = {
 #if ENABLE(VIDEO)
     { "HTML5VideoViewProxy", android::register_mediaplayer },
 #endif
-    { "PluginActivity", android::register_plugin_activity },
 };
 
 EXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved)
index 4e3d8bf..1139086 100644 (file)
@@ -191,7 +191,8 @@ struct WebViewCore::JavaGlue {
     jmethodID   m_addMessageToConsole;
     jmethodID   m_getPluginClass;
     jmethodID   m_createPluginJavaInstance;
-    jmethodID   m_startFullScreenPluginActivity;
+    jmethodID   m_showFullScreenPlugin;
+    jmethodID   m_hideFullScreenPlugin;
     jmethodID   m_createSurface;
     jmethodID   m_updateSurface;
     jmethodID   m_destroySurface;
@@ -271,7 +272,8 @@ WebViewCore::WebViewCore(JNIEnv* env, jobject javaWebViewCore, WebCore::Frame* m
     m_javaGlue->m_addMessageToConsole = GetJMethod(env, clazz, "addMessageToConsole", "(Ljava/lang/String;ILjava/lang/String;)V");
     m_javaGlue->m_getPluginClass = GetJMethod(env, clazz, "getPluginClass", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Class;");
     m_javaGlue->m_createPluginJavaInstance = GetJMethod(env, clazz, "createPluginJavaInstance", "(Ljava/lang/String;I)Landroid/webkit/plugin/WebkitPlugin;");
-    m_javaGlue->m_startFullScreenPluginActivity = GetJMethod(env, clazz, "startFullScreenPluginActivity", "(I)V");
+    m_javaGlue->m_showFullScreenPlugin = GetJMethod(env, clazz, "showFullScreenPlugin", "(Landroid/webkit/plugin/WebkitPlugin;)V");
+    m_javaGlue->m_hideFullScreenPlugin = GetJMethod(env, clazz, "hideFullScreenPlugin", "()V");
     m_javaGlue->m_createSurface = GetJMethod(env, clazz, "createSurface", "(Landroid/webkit/plugin/WebkitPlugin;IIII)Landroid/webkit/ViewManager$ChildView;");
     m_javaGlue->m_updateSurface = GetJMethod(env, clazz, "updateSurface", "(Landroid/webkit/ViewManager$ChildView;IIII)V");
     m_javaGlue->m_destroySurface = GetJMethod(env, clazz, "destroySurface", "(Landroid/webkit/ViewManager$ChildView;)V");
@@ -2493,7 +2495,7 @@ jobject WebViewCore::createPluginJavaInstance(const WebCore::String& libName, NP
     return result;
 }
 
-void WebViewCore::startFullScreenPluginActivity(NPP npp)
+void WebViewCore::showFullScreenPlugin(jobject webkitPlugin)
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
     AutoJObject obj = m_javaGlue->object(env);
@@ -2503,7 +2505,20 @@ void WebViewCore::startFullScreenPluginActivity(NPP npp)
         return;
 
     env->CallVoidMethod(obj.get(),
-                        m_javaGlue->m_startFullScreenPluginActivity, (int) npp);
+                        m_javaGlue->m_showFullScreenPlugin, webkitPlugin);
+    checkException(env);
+}
+
+void WebViewCore::hideFullScreenPlugin()
+{
+    JNIEnv* env = JSC::Bindings::getJNIEnv();
+    AutoJObject obj = m_javaGlue->object(env);
+    // if it is called during DESTROY is handled, the real object of WebViewCore
+    // can be gone. Check before using it.
+    if (!obj.get())
+        return;
+
+    env->CallVoidMethod(obj.get(), m_javaGlue->m_hideFullScreenPlugin);
     checkException(env);
 }
 
index 8a0df23..e3c9b51 100644 (file)
@@ -376,8 +376,11 @@ namespace android {
         // Creates a new instance of the plugin's java component
         jobject createPluginJavaInstance(const WebCore::String& libName, NPP npp);
 
-        // Creates a full screen surface (i.e. View on an Activity) for a plugin
-        void startFullScreenPluginActivity(NPP npp);
+        // Creates a full screen surface for a plugin
+        void showFullScreenPlugin(jobject webkitPlugin);
+
+        // Discards the full screen surface of a plugin
+        void hideFullScreenPlugin();
 
         // Creates a Surface (i.e. View) for a plugin
         jobject createSurface(jobject webkitPlugin, int x, int y, int width, int height);
index 543332d..6d7b8e5 100644 (file)
@@ -55,7 +55,14 @@ static void anp_showKeyboard(NPP instance, bool value) {
 static void anp_requestFullScreen(NPP instance) {
     PluginView* pluginView = pluginViewForInstance(instance);
     PluginWidgetAndroid* pluginWidget = pluginView->platformPluginWidget();
-    pluginWidget->webViewCore()->startFullScreenPluginActivity(instance);
+    jobject javaPlugin = pluginWidget->getJavaPluginInstance();
+    pluginWidget->webViewCore()->showFullScreenPlugin(javaPlugin);
+}
+
+static void anp_exitFullScreen(NPP instance) {
+    PluginView* pluginView = pluginViewForInstance(instance);
+    PluginWidgetAndroid* pluginWidget = pluginView->platformPluginWidget();
+    pluginWidget->webViewCore()->hideFullScreenPlugin();
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -69,4 +76,5 @@ void ANPWindowInterfaceV0_Init(ANPInterface* value) {
     ASSIGN(i, clearVisibleRects);
     ASSIGN(i, showKeyboard);
     ASSIGN(i, requestFullScreen);
+    ASSIGN(i, exitFullScreen);
 }
index 40a31fa..e52debb 100644 (file)
@@ -647,6 +647,10 @@ struct ANPWindowInterfaceV0 : ANPInterface {
         asynchronously to provide a View object to be displayed full screen.
      */
     void    (*requestFullScreen)(NPP instance);
+    /** Called when a plugin wishes to exit from full screen mode. As a result,
+        the plugin's full screen view will be discarded by the view system.
+     */
+    void    (*exitFullScreen)(NPP instance);
 };
 
 ///////////////////////////////////////////////////////////////////////////////