summaryrefslogtreecommitdiffstats
path: root/WebKit/android/plugins/PluginWidgetAndroid.cpp
diff options
context:
space:
mode:
authorDerek Sollenberger <djsollen@google.com>2010-03-16 16:29:40 -0400
committerDerek Sollenberger <djsollen@google.com>2010-03-16 16:30:38 -0400
commit1d7ddf2fb889b97549e1041bbbf53e481b4ced2c (patch)
tree0e8c6993f084b383a6b829c135cf1145a2dbd121 /WebKit/android/plugins/PluginWidgetAndroid.cpp
parentbfcd11290caa86fe38f2f6869cb3959f5853171a (diff)
downloadexternal_webkit-1d7ddf2fb889b97549e1041bbbf53e481b4ced2c.zip
external_webkit-1d7ddf2fb889b97549e1041bbbf53e481b4ced2c.tar.gz
external_webkit-1d7ddf2fb889b97549e1041bbbf53e481b4ced2c.tar.bz2
Ensure a plugin is not shown if it is completely obscured by other
html content. Change-Id: Iffcc30d47428708842ac5dddee41cc611d879c1c
Diffstat (limited to 'WebKit/android/plugins/PluginWidgetAndroid.cpp')
-rw-r--r--WebKit/android/plugins/PluginWidgetAndroid.cpp37
1 files changed, 29 insertions, 8 deletions
diff --git a/WebKit/android/plugins/PluginWidgetAndroid.cpp b/WebKit/android/plugins/PluginWidgetAndroid.cpp
index fd46309..c4b7e97 100644
--- a/WebKit/android/plugins/PluginWidgetAndroid.cpp
+++ b/WebKit/android/plugins/PluginWidgetAndroid.cpp
@@ -70,6 +70,7 @@ PluginWidgetAndroid::PluginWidgetAndroid(WebCore::PluginView* view)
m_embeddedView = NULL;
m_embeddedViewAttached = false;
m_acceptEvents = false;
+ m_isSurfaceClippedOut = false;
}
PluginWidgetAndroid::~PluginWidgetAndroid() {
@@ -124,7 +125,7 @@ void PluginWidgetAndroid::setWindow(NPWindow* window, bool isTransparent) {
m_pluginBounds.fLeft, m_pluginBounds.fTop,
m_pluginBounds.fRight, m_pluginBounds.fBottom);
- updateSurfaceIfNeeded(m_pluginBounds != oldPluginBounds);
+ layoutSurface(m_pluginBounds != oldPluginBounds);
if (m_drawingModel != kSurface_ANPDrawingModel) {
m_flipPixelRef->safeUnref();
@@ -209,16 +210,36 @@ void PluginWidgetAndroid::draw(SkCanvas* canvas) {
}
}
-void PluginWidgetAndroid::updateSurfaceIfNeeded(bool pluginBoundsChanged) {
+void PluginWidgetAndroid::setSurfaceClip(const SkIRect& clip) {
if (m_drawingModel != kSurface_ANPDrawingModel)
return;
- PLUGIN_LOG("%p Plugin Visible self=[%d] parent=[%d]", m_pluginView->instance(),
- m_pluginView->isSelfVisible(), m_pluginView->isParentVisible());
+ /* don't display surfaces that are either entirely clipped or only 1x1 in
+ size. It appears that when an element is absolutely positioned and has
+ been completely clipped in CSS that webkit still sends a clip of 1x1.
+ */
+ bool clippedOut = (clip.width() <= 1 && clip.height() <= 1);
+ if(clippedOut != m_isSurfaceClippedOut) {
+ m_isSurfaceClippedOut = clippedOut;
+ layoutSurface();
+ }
+}
+
+void PluginWidgetAndroid::layoutSurface(bool pluginBoundsChanged) {
+
+ if (m_drawingModel != kSurface_ANPDrawingModel)
+ return;
+
+
+
+ bool displayPlugin = m_pluginView->isVisible() && !m_isSurfaceClippedOut;
+ PLUGIN_LOG("%p DisplayPlugin[%d] visible=[%d] clipped=[%d]",
+ m_pluginView->instance(), displayPlugin,
+ m_pluginView->isVisible(), m_isSurfaceClippedOut);
// if the surface does not exist then create a new surface
- if (!m_embeddedView && m_pluginView->isVisible()) {
+ if (!m_embeddedView && displayPlugin) {
WebCore::PluginPackage* pkg = m_pluginView->plugin();
NPP instance = m_pluginView->instance();
@@ -237,16 +258,16 @@ void PluginWidgetAndroid::updateSurfaceIfNeeded(bool pluginBoundsChanged) {
m_embeddedViewAttached = true;
}
// if the view is unattached but visible then attach it
- } else if (m_embeddedView && !m_embeddedViewAttached && m_pluginView->isVisible() && !m_isFullScreen) {
+ } else if (m_embeddedView && !m_embeddedViewAttached && displayPlugin && !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()) {
+ } else if (m_embeddedView && m_embeddedViewAttached && !displayPlugin) {
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) {
+ } else if (pluginBoundsChanged && displayPlugin && !m_isFullScreen) {
m_core->updateSurface(m_embeddedView, m_pluginWindow->x, m_pluginWindow->y,
m_pluginWindow->width, m_pluginWindow->height);