summaryrefslogtreecommitdiffstats
path: root/WebKit
diff options
context:
space:
mode:
authorDerek Sollenberger <djsollen@google.com>2009-12-08 15:44:57 -0500
committerDerek Sollenberger <djsollen@google.com>2009-12-14 08:46:40 -0500
commitb13fe2289ea65a0b980e31d4dc680d811ec6fdf6 (patch)
tree754cd6515aa48d6a2a26c2fe3ed9748533a664dc /WebKit
parent9652d6b88e01f27d69c804ac6bc56b527b33c219 (diff)
downloadexternal_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.cpp29
-rw-r--r--WebKit/android/jni/WebViewCore.h7
-rw-r--r--WebKit/android/plugins/ANPWindowInterface.cpp5
-rw-r--r--WebKit/android/plugins/PluginWidgetAndroid.cpp38
-rw-r--r--WebKit/android/plugins/PluginWidgetAndroid.h18
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.