diff options
| author | Derek Sollenberger <djsollen@google.com> | 2009-12-08 15:44:57 -0500 |
|---|---|---|
| committer | Derek Sollenberger <djsollen@google.com> | 2009-12-14 08:46:40 -0500 |
| commit | b13fe2289ea65a0b980e31d4dc680d811ec6fdf6 (patch) | |
| tree | 754cd6515aa48d6a2a26c2fe3ed9748533a664dc /WebKit | |
| parent | 9652d6b88e01f27d69c804ac6bc56b527b33c219 (diff) | |
| download | external_webkit-b13fe2289ea65a0b980e31d4dc680d811ec6fdf6.zip external_webkit-b13fe2289ea65a0b980e31d4dc680d811ec6fdf6.tar.gz external_webkit-b13fe2289ea65a0b980e31d4dc680d811ec6fdf6.tar.bz2 | |
Notify native plugin code when the browser discards the customView.
Diffstat (limited to 'WebKit')
| -rw-r--r-- | WebKit/android/jni/WebViewCore.cpp | 29 | ||||
| -rw-r--r-- | WebKit/android/jni/WebViewCore.h | 7 | ||||
| -rw-r--r-- | WebKit/android/plugins/ANPWindowInterface.cpp | 5 | ||||
| -rw-r--r-- | WebKit/android/plugins/PluginWidgetAndroid.cpp | 38 | ||||
| -rw-r--r-- | WebKit/android/plugins/PluginWidgetAndroid.h | 18 |
5 files changed, 77 insertions, 20 deletions
diff --git a/WebKit/android/jni/WebViewCore.cpp b/WebKit/android/jni/WebViewCore.cpp index c6034aa..4bff8a7 100644 --- a/WebKit/android/jni/WebViewCore.cpp +++ b/WebKit/android/jni/WebViewCore.cpp @@ -291,7 +291,7 @@ 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_showFullScreenPlugin = GetJMethod(env, clazz, "showFullScreenPlugin", "(Landroid/webkit/plugin/WebkitPlugin;)V"); + m_javaGlue->m_showFullScreenPlugin = GetJMethod(env, clazz, "showFullScreenPlugin", "(Landroid/webkit/plugin/WebkitPlugin;I)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"); @@ -1442,6 +1442,18 @@ void WebViewCore::sendPluginEvent(const ANPEvent& evt) } } +PluginWidgetAndroid* WebViewCore::getPluginWidget(NPP npp) +{ + PluginWidgetAndroid** iter = m_plugins.begin(); + PluginWidgetAndroid** stop = m_plugins.end(); + for (; iter < stop; ++iter) { + if ((*iter)->pluginView()->instance() == npp) { + return (*iter); + } + } + return NULL; +} + static PluginView* nodeIsPlugin(Node* node) { RenderObject* renderer = node->renderer(); if (renderer && renderer->isWidget()) { @@ -2548,7 +2560,7 @@ jobject WebViewCore::createPluginJavaInstance(const WebCore::String& libName, NP return result; } -void WebViewCore::showFullScreenPlugin(jobject webkitPlugin) +void WebViewCore::showFullScreenPlugin(jobject webkitPlugin, NPP npp) { JNIEnv* env = JSC::Bindings::getJNIEnv(); AutoJObject obj = m_javaGlue->object(env); @@ -2558,7 +2570,8 @@ void WebViewCore::showFullScreenPlugin(jobject webkitPlugin) return; env->CallVoidMethod(obj.get(), - m_javaGlue->m_showFullScreenPlugin, webkitPlugin); + m_javaGlue->m_showFullScreenPlugin, + webkitPlugin, (int)npp); checkException(env); } @@ -3198,6 +3211,14 @@ static void ProvideVisitedHistory(JNIEnv *env, jobject obj, jobject hist) env->DeleteLocalRef(array); } +// Notification from the UI thread that the plugin's full-screen surface has been discarded +static void FullScreenPluginHidden(JNIEnv* env, jobject obj, jint npp) +{ + WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj); + PluginWidgetAndroid* plugin = viewImpl->getPluginWidget((NPP)npp); + plugin->exitFullScreen(false); +} + // ---------------------------------------------------------------------------- /* @@ -3292,6 +3313,8 @@ static JNINativeMethod gJavaWebViewCoreMethods[] = { (void*) UpdateFrameCacheIfLoading }, { "nativeProvideVisitedHistory", "([Ljava/lang/String;)V", (void*) ProvideVisitedHistory }, + { "nativeFullScreenPluginHidden", "(I)V", + (void*) FullScreenPluginHidden }, }; int register_webviewcore(JNIEnv* env) diff --git a/WebKit/android/jni/WebViewCore.h b/WebKit/android/jni/WebViewCore.h index a469329..3f00f3c 100644 --- a/WebKit/android/jni/WebViewCore.h +++ b/WebKit/android/jni/WebViewCore.h @@ -364,6 +364,9 @@ namespace android { // send this event to all of the plugins who have the given flag set void sendPluginEvent(const ANPEvent& evt, ANPEventFlag flag); + // lookup the plugin widget struct given an NPP + PluginWidgetAndroid* getPluginWidget(NPP npp); + // return the cursorNode if it is a plugin Node* cursorNodeIsPlugin(); @@ -380,9 +383,9 @@ namespace android { jobject createPluginJavaInstance(const WebCore::String& libName, NPP npp); // Creates a full screen surface for a plugin - void showFullScreenPlugin(jobject webkitPlugin); + void showFullScreenPlugin(jobject webkitPlugin, NPP npp); - // Discards the full screen surface of a plugin + // Instructs the UI thread to discard the plugin's full-screen surface void hideFullScreenPlugin(); // Creates a Surface (i.e. View) for a plugin diff --git a/WebKit/android/plugins/ANPWindowInterface.cpp b/WebKit/android/plugins/ANPWindowInterface.cpp index 6d7b8e5..c8c2c70 100644 --- a/WebKit/android/plugins/ANPWindowInterface.cpp +++ b/WebKit/android/plugins/ANPWindowInterface.cpp @@ -55,14 +55,13 @@ static void anp_showKeyboard(NPP instance, bool value) { static void anp_requestFullScreen(NPP instance) { PluginView* pluginView = pluginViewForInstance(instance); PluginWidgetAndroid* pluginWidget = pluginView->platformPluginWidget(); - jobject javaPlugin = pluginWidget->getJavaPluginInstance(); - pluginWidget->webViewCore()->showFullScreenPlugin(javaPlugin); + pluginWidget->requestFullScreen(); } static void anp_exitFullScreen(NPP instance) { PluginView* pluginView = pluginViewForInstance(instance); PluginWidgetAndroid* pluginWidget = pluginView->platformPluginWidget(); - pluginWidget->webViewCore()->hideFullScreenPlugin(); + pluginWidget->exitFullScreen(true); } /////////////////////////////////////////////////////////////////////////////// diff --git a/WebKit/android/plugins/PluginWidgetAndroid.cpp b/WebKit/android/plugins/PluginWidgetAndroid.cpp index 36d7420..f8862b2 100644 --- a/WebKit/android/plugins/PluginWidgetAndroid.cpp +++ b/WebKit/android/plugins/PluginWidgetAndroid.cpp @@ -52,27 +52,28 @@ PluginWidgetAndroid::PluginWidgetAndroid(WebCore::PluginView* view) m_visibleDocRect.setEmpty(); m_pluginBounds.setEmpty(); m_hasFocus = false; + m_isFullScreen = false; m_zoomLevel = 0; - m_childView = NULL; m_webkitPlugin = NULL; + m_embeddedView = NULL; } PluginWidgetAndroid::~PluginWidgetAndroid() { if (m_core) { m_core->removePlugin(this); - if (m_childView) { - m_core->destroySurface(m_childView); + if (m_embeddedView) { + m_core->destroySurface(m_embeddedView); } } // cleanup any remaining JNI References JNIEnv* env = JSC::Bindings::getJNIEnv(); - if (m_childView) { - env->DeleteGlobalRef(m_childView); - } if (m_webkitPlugin) { env->DeleteGlobalRef(m_webkitPlugin); } + if (m_embeddedView) { + env->DeleteGlobalRef(m_embeddedView); + } m_flipPixelRef->safeUnref(); } @@ -119,19 +120,19 @@ void PluginWidgetAndroid::setWindow(NPWindow* window, bool isTransparent) { IntPoint docPoint = frameToDocumentCoords(window->x, window->y); // if the surface exists check for changes and update accordingly - if (m_childView && m_pluginBounds != oldPluginBounds) { + if (m_embeddedView && m_pluginBounds != oldPluginBounds) { - m_core->updateSurface(m_childView, docPoint.x(), docPoint.y(), + m_core->updateSurface(m_embeddedView, docPoint.x(), docPoint.y(), window->width, window->height); // if the surface does not exist then create a new surface - } else if(!m_childView) { + } else if(!m_embeddedView) { jobject tempObj = m_core->createSurface(getJavaPluginInstance(), docPoint.x(), docPoint.y(), window->width, window->height); if (tempObj) { JNIEnv* env = JSC::Bindings::getJNIEnv(); - m_childView = env->NewGlobalRef(tempObj); + m_embeddedView = env->NewGlobalRef(tempObj); } } } else { @@ -430,3 +431,20 @@ IntPoint PluginWidgetAndroid::frameToDocumentCoords(int frameX, int frameY) cons return docPoint; } + +void PluginWidgetAndroid::requestFullScreen() { + if (m_isFullScreen || !m_webkitPlugin) { + return; + } + + m_core->showFullScreenPlugin(m_webkitPlugin, m_pluginView->instance()); + m_isFullScreen = true; +} + +void PluginWidgetAndroid::exitFullScreen(bool pluginInitiated) { + if (m_isFullScreen && pluginInitiated) { + m_core->hideFullScreenPlugin(); + } + + m_isFullScreen = false; +} diff --git a/WebKit/android/plugins/PluginWidgetAndroid.h b/WebKit/android/plugins/PluginWidgetAndroid.h index 24ef69b..ef3e40c 100644 --- a/WebKit/android/plugins/PluginWidgetAndroid.h +++ b/WebKit/android/plugins/PluginWidgetAndroid.h @@ -125,13 +125,26 @@ struct PluginWidgetAndroid { */ void setVisibleRects(const ANPRectI rects[], int32_t count); - /** Returns a java object that implements the WebkitPlugin interface. The + /** Returns a java object that implements the WebkitPlugin interface. The implementation is located in the plugin's apk and is described in the apk's manifest file. For each plugin instance in webkit there is at most one instance of the java object associated with that plugin. */ jobject getJavaPluginInstance(); + /** Called when a plugin wishes to enter into full screen mode. It invokes + the plugin's Java class (defined in the plugin's apk manifest), which is + called asynchronously and provides a View to be displayed full screen. + */ + void requestFullScreen(); + + /** Called when a plugin wishes to exit from full screen mode. As a result, + the plugin's full-screen view is discarded by the view system. It is also + called in order to notify the native code that the browser has discarded + the view. + */ + void exitFullScreen(bool pluginInitiated); + private: WebCore::IntPoint frameToDocumentCoords(int frameX, int frameY) const; void computeVisibleFrameRect(); @@ -147,9 +160,10 @@ private: SkIRect m_visibleDocRect; SkIRect m_requestedFrameRect; bool m_hasFocus; + bool m_isFullScreen; float m_zoomLevel; - jobject m_childView; jobject m_webkitPlugin; + jobject m_embeddedView; /* We limit the number of rectangles to minimize storage and ensure adequate speed. |
