summaryrefslogtreecommitdiffstats
path: root/WebKit/android/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'WebKit/android/plugins')
-rw-r--r--WebKit/android/plugins/PluginDebugAndroid.h2
-rw-r--r--WebKit/android/plugins/PluginWidgetAndroid.cpp94
-rw-r--r--WebKit/android/plugins/PluginWidgetAndroid.h8
3 files changed, 71 insertions, 33 deletions
diff --git a/WebKit/android/plugins/PluginDebugAndroid.h b/WebKit/android/plugins/PluginDebugAndroid.h
index 92092d5..3f328f9 100644
--- a/WebKit/android/plugins/PluginDebugAndroid.h
+++ b/WebKit/android/plugins/PluginDebugAndroid.h
@@ -35,7 +35,7 @@
// Android plug-in code in this directory.
#define PLUGIN_DEBUG_GLOBAL 0
-#if PLUGIN_DEBUG_GLOBAL || defined(PLUGIN_DEBUG_LOCAL)
+#if PLUGIN_DEBUG_GLOBAL || (defined(PLUGIN_DEBUG_LOCAL) && PLUGIN_DEBUG_LOCAL)
# define PLUGIN_LOG(FORMAT, ARGS...) do { anp_logPlugin(FORMAT, ## ARGS); } while(0)
# define PLUGIN_LOG_EVENT(NPP, EVT, RET, TIME) do { anp_logPluginEvent(NPP, EVT, RET, TIME); } while(0)
diff --git a/WebKit/android/plugins/PluginWidgetAndroid.cpp b/WebKit/android/plugins/PluginWidgetAndroid.cpp
index cec254e..7642f13 100644
--- a/WebKit/android/plugins/PluginWidgetAndroid.cpp
+++ b/WebKit/android/plugins/PluginWidgetAndroid.cpp
@@ -68,6 +68,7 @@ PluginWidgetAndroid::PluginWidgetAndroid(WebCore::PluginView* view)
m_visible = true;
m_zoomLevel = 0;
m_embeddedView = NULL;
+ m_embeddedViewAttached = false;
m_acceptEvents = false;
}
@@ -119,36 +120,13 @@ void PluginWidgetAndroid::setWindow(NPWindow* window, bool isTransparent) {
m_pluginWindow->x + m_pluginWindow->width,
m_pluginWindow->y + m_pluginWindow->height);
- if (m_drawingModel == kSurface_ANPDrawingModel) {
+ PLUGIN_LOG("%p PluginBounds (%d,%d,%d,%d)", m_pluginView->instance(),
+ m_pluginBounds.fLeft, m_pluginBounds.fTop,
+ m_pluginBounds.fRight, m_pluginBounds.fBottom);
- // if the surface does not exist then create a new surface
- if (!m_embeddedView) {
+ updateSurfaceIfNeeded(m_pluginBounds != oldPluginBounds);
- WebCore::PluginPackage* pkg = m_pluginView->plugin();
- NPP instance = m_pluginView->instance();
-
- jobject pluginSurface;
- pkg->pluginFuncs()->getvalue(instance, kJavaSurface_ANPGetValue,
- static_cast<void*>(&pluginSurface));
-
- jobject tempObj = m_core->addSurface(pluginSurface,
- window->x, window->y,
- window->width, window->height);
- if (tempObj) {
- JNIEnv* env = JSC::Bindings::getJNIEnv();
- m_embeddedView = env->NewGlobalRef(tempObj);
- }
- } else if (m_pluginBounds != oldPluginBounds) {
- // if the surface exists check for changes and update accordingly
- if (m_isFullScreen) {
- m_core->updateFullScreenPlugin(window->x, window->y,
- window->width, window->height);
- } else {
- m_core->updateSurface(m_embeddedView, window->x, window->y,
- window->width, window->height);
- }
- }
- } else {
+ if (m_drawingModel != kSurface_ANPDrawingModel) {
m_flipPixelRef->safeUnref();
m_flipPixelRef = new SkFlipPixelRef(computeConfig(isTransparent),
window->width, window->height);
@@ -231,6 +209,50 @@ void PluginWidgetAndroid::draw(SkCanvas* canvas) {
}
}
+void PluginWidgetAndroid::updateSurfaceIfNeeded(bool pluginBoundsChanged) {
+
+ if (m_drawingModel != kSurface_ANPDrawingModel)
+ return;
+
+ PLUGIN_LOG("%p Plugin Visible self=[%d] parent=[%d]", m_pluginView->instance(),
+ m_pluginView->isSelfVisible(), m_pluginView->isParentVisible());
+
+ // if the surface does not exist then create a new surface
+ if (!m_embeddedView && m_pluginView->isVisible()) {
+
+ WebCore::PluginPackage* pkg = m_pluginView->plugin();
+ NPP instance = m_pluginView->instance();
+
+ jobject pluginSurface;
+ pkg->pluginFuncs()->getvalue(instance, kJavaSurface_ANPGetValue,
+ static_cast<void*>(&pluginSurface));
+
+ jobject tempObj = m_core->addSurface(pluginSurface,
+ m_pluginWindow->x, m_pluginWindow->y,
+ m_pluginWindow->width, m_pluginWindow->height);
+
+ if (tempObj) {
+ JNIEnv* env = JSC::Bindings::getJNIEnv();
+ m_embeddedView = env->NewGlobalRef(tempObj);
+ m_embeddedViewAttached = true;
+ }
+ // if the view is unattached but visible then attach it
+ } else if (m_embeddedView && !m_embeddedViewAttached && m_pluginView->isVisible() && !m_isFullScreen) {
+ m_core->updateSurface(m_embeddedView, m_pluginWindow->x, m_pluginWindow->y,
+ m_pluginWindow->width, m_pluginWindow->height);
+ m_embeddedViewAttached = true;
+ // if the view is attached but invisible then remove it
+ } else if (m_embeddedView && m_embeddedViewAttached && !m_pluginView->isVisible()) {
+ m_core->destroySurface(m_embeddedView);
+ m_embeddedViewAttached = false;
+ // if the plugin's bounds have changed and it's visible then update it
+ } else if (pluginBoundsChanged && m_pluginView->isVisible() && !m_isFullScreen) {
+ m_core->updateSurface(m_embeddedView, m_pluginWindow->x, m_pluginWindow->y,
+ m_pluginWindow->width, m_pluginWindow->height);
+
+ }
+}
+
int16 PluginWidgetAndroid::sendEvent(const ANPEvent& evt) {
if (!m_acceptEvents)
return 0;
@@ -316,16 +338,24 @@ void PluginWidgetAndroid::setVisibleScreen(const ANPRectI& visibleDocRect, float
int newScreenW = m_visibleDocRect.width();
int newScreenH = m_visibleDocRect.height();
- PLUGIN_LOG("%s VisibleDoc Dimensions old=[%d,%d] new=[%d,%d] ",
- __FUNCTION__, oldScreenW, oldScreenH, newScreenW, newScreenH);
-
// if the screen dimensions have changed by more than 5 pixels in either
// direction then recompute the plugin's visible rectangle
- if (abs(oldScreenW - newScreenW) > 5 || abs(oldScreenH - newScreenH) > 5)
+ if (abs(oldScreenW - newScreenW) > 5 || abs(oldScreenH - newScreenH) > 5) {
+ PLUGIN_LOG("%s VisibleDoc old=[%d,%d] new=[%d,%d] ", __FUNCTION__,
+ oldScreenW, oldScreenH, newScreenW, newScreenH);
computeVisiblePluginRect();
+ }
bool visible = SkIRect::Intersects(m_visibleDocRect, m_pluginBounds);
if(m_visible != visible) {
+
+#if DEBUG_VISIBLE_RECTS
+ PLUGIN_LOG("%p changeVisiblity[%d] pluginBounds(%d,%d,%d,%d)",
+ m_pluginView->instance(), visible,
+ m_pluginBounds.fLeft, m_pluginBounds.fTop,
+ m_pluginBounds.fRight, m_pluginBounds.fBottom);
+#endif
+
// change the visibility
m_visible = visible;
// send the event
diff --git a/WebKit/android/plugins/PluginWidgetAndroid.h b/WebKit/android/plugins/PluginWidgetAndroid.h
index b47a4b3..7223a16 100644
--- a/WebKit/android/plugins/PluginWidgetAndroid.h
+++ b/WebKit/android/plugins/PluginWidgetAndroid.h
@@ -141,6 +141,13 @@ struct PluginWidgetAndroid {
*/
bool hasFocus() const { return m_hasFocus; }
+ /** Called to ensure the surface is being correctly displayed within the
+ view hierarchy. For instance, if the visibility of the plugin has
+ changed then we need to ensure the surface is added or removed from the
+ view system.
+ */
+ void updateSurfaceIfNeeded(bool pluginBoundsChanged = false);
+
private:
void computeVisiblePluginRect();
void scrollToVisiblePluginRect();
@@ -159,6 +166,7 @@ private:
bool m_visible;
float m_zoomLevel;
jobject m_embeddedView;
+ bool m_embeddedViewAttached;
bool m_acceptEvents;
/* We limit the number of rectangles to minimize storage and ensure adequate