From dcab27c390251a3b534b8eeb1fa5b8301686b1ab Mon Sep 17 00:00:00 2001 From: Derek Sollenberger Date: Mon, 7 Dec 2009 16:18:43 -0500 Subject: [PATCH] Switching from activity based full screen plugins to a view system overlay. --- WebKit/Android.mk | 1 - WebKit/android/jni/PluginActivity.cpp | 77 --------------------------- WebKit/android/jni/WebCoreJniOnLoad.cpp | 2 - WebKit/android/jni/WebViewCore.cpp | 23 ++++++-- WebKit/android/jni/WebViewCore.h | 7 ++- WebKit/android/plugins/ANPWindowInterface.cpp | 10 +++- WebKit/android/plugins/android_npapi.h | 4 ++ 7 files changed, 37 insertions(+), 87 deletions(-) delete mode 100644 WebKit/android/jni/PluginActivity.cpp diff --git a/WebKit/Android.mk b/WebKit/Android.mk index 04e223a1e..2f0b5d48c 100644 --- a/WebKit/Android.mk +++ b/WebKit/Android.mk @@ -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 index 47e961ec8..000000000 --- a/WebKit/android/jni/PluginActivity.cpp +++ /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 - -#include "PluginView.h" -#include "PluginWidgetAndroid.h" -#include "WebCoreJni.h" -#include "jni_utility.h" -#include - -namespace android { - - -static WebCore::PluginView* pluginViewForInstance(NPP instance) { - if (instance && instance->ndata) - return static_cast(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 */ diff --git a/WebKit/android/jni/WebCoreJniOnLoad.cpp b/WebKit/android/jni/WebCoreJniOnLoad.cpp index 6711e6bf2..616526b20 100644 --- a/WebKit/android/jni/WebCoreJniOnLoad.cpp +++ b/WebKit/android/jni/WebCoreJniOnLoad.cpp @@ -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) diff --git a/WebKit/android/jni/WebViewCore.cpp b/WebKit/android/jni/WebViewCore.cpp index 4e3d8bfeb..113908624 100644 --- a/WebKit/android/jni/WebViewCore.cpp +++ b/WebKit/android/jni/WebViewCore.cpp @@ -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); } diff --git a/WebKit/android/jni/WebViewCore.h b/WebKit/android/jni/WebViewCore.h index 8a0df235a..e3c9b5136 100644 --- a/WebKit/android/jni/WebViewCore.h +++ b/WebKit/android/jni/WebViewCore.h @@ -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); diff --git a/WebKit/android/plugins/ANPWindowInterface.cpp b/WebKit/android/plugins/ANPWindowInterface.cpp index 543332d56..6d7b8e5f1 100644 --- a/WebKit/android/plugins/ANPWindowInterface.cpp +++ b/WebKit/android/plugins/ANPWindowInterface.cpp @@ -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); } diff --git a/WebKit/android/plugins/android_npapi.h b/WebKit/android/plugins/android_npapi.h index 40a31fa55..e52debb9b 100644 --- a/WebKit/android/plugins/android_npapi.h +++ b/WebKit/android/plugins/android_npapi.h @@ -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); }; /////////////////////////////////////////////////////////////////////////////// -- 2.11.0