summaryrefslogtreecommitdiffstats
path: root/WebCore/rendering/RenderLayerCompositor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/rendering/RenderLayerCompositor.cpp')
-rw-r--r--WebCore/rendering/RenderLayerCompositor.cpp44
1 files changed, 21 insertions, 23 deletions
diff --git a/WebCore/rendering/RenderLayerCompositor.cpp b/WebCore/rendering/RenderLayerCompositor.cpp
index 835d21e..da804dd 100644
--- a/WebCore/rendering/RenderLayerCompositor.cpp
+++ b/WebCore/rendering/RenderLayerCompositor.cpp
@@ -42,6 +42,7 @@
#include "HitTestResult.h"
#include "NodeList.h"
#include "Page.h"
+#include "RenderApplet.h"
#include "RenderEmbeddedObject.h"
#include "RenderIFrame.h"
#include "RenderLayerBacking.h"
@@ -1101,6 +1102,15 @@ bool RenderLayerCompositor::has3DContent() const
return layerHas3DContent(rootRenderLayer());
}
+bool RenderLayerCompositor::allowsIndependentlyCompositedIFrames(const FrameView* view)
+{
+#if PLATFORM(MAC)
+ // iframes are only independently composited in Mac pre-WebKit2.
+ return view->platformWidget();
+#endif
+ return false;
+}
+
bool RenderLayerCompositor::shouldPropagateCompositingToEnclosingIFrame() const
{
// Parent document content needs to be able to render on top of a composited iframe, so correct behavior
@@ -1111,12 +1121,7 @@ bool RenderLayerCompositor::shouldPropagateCompositingToEnclosingIFrame() const
if (!renderer || !renderer->isRenderIFrame())
return false;
-#if !PLATFORM(MAC)
- // On non-Mac platforms, let compositing propagate for all iframes.
- return true;
-#else
- // If we're viewless (i.e. WebKit2), we always propagate compositing.
- if (!m_renderView->frameView()->platformWidget())
+ if (!allowsIndependentlyCompositedIFrames(m_renderView->frameView()))
return true;
// On Mac, only propagate compositing if the iframe is overlapped in the parent
@@ -1125,17 +1130,11 @@ bool RenderLayerCompositor::shouldPropagateCompositingToEnclosingIFrame() const
if (iframeRenderer->widget()) {
ASSERT(iframeRenderer->widget()->isFrameView());
FrameView* view = static_cast<FrameView*>(iframeRenderer->widget());
- if (view->isOverlapped())
+ if (view->isOverlappedIncludingAncestors() || view->hasCompositingAncestor())
return true;
-
- if (RenderView* view = iframeRenderer->view()) {
- if (view->compositor()->inCompositingMode())
- return true;
- }
}
return false;
-#endif
}
HTMLFrameOwnerElement* RenderLayerCompositor::enclosingIFrameElement() const
@@ -1314,21 +1313,20 @@ bool RenderLayerCompositor::requiresCompositingForCanvas(RenderObject* renderer)
bool RenderLayerCompositor::requiresCompositingForPlugin(RenderObject* renderer) const
{
- if (!renderer->isEmbeddedObject())
- return false;
-
- RenderEmbeddedObject* embedRenderer = toRenderEmbeddedObject(renderer);
- if (!embedRenderer->allowsAcceleratedCompositing())
+ bool composite = (renderer->isEmbeddedObject() && toRenderEmbeddedObject(renderer)->allowsAcceleratedCompositing())
+ || (renderer->isApplet() && toRenderApplet(renderer)->allowsAcceleratedCompositing());
+ if (!composite)
return false;
m_compositingDependsOnGeometry = true;
-
+
+ RenderWidget* pluginRenderer = toRenderWidget(renderer);
// If we can't reliably know the size of the plugin yet, don't change compositing state.
- if (renderer->needsLayout())
- return embedRenderer->hasLayer() && embedRenderer->layer()->isComposited();
+ if (pluginRenderer->needsLayout())
+ return pluginRenderer->hasLayer() && pluginRenderer->layer()->isComposited();
// Don't go into compositing mode if height or width are zero, or size is 1x1.
- IntRect contentBox = embedRenderer->contentBoxRect();
+ IntRect contentBox = pluginRenderer->contentBoxRect();
return contentBox.height() * contentBox.width() > 1;
}
@@ -1561,7 +1559,7 @@ void RenderLayerCompositor::notifyIFramesOfCompositingChange()
if (!frame)
return;
- for (Frame* child = frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) {
+ for (Frame* child = frame->tree()->firstChild(); child; child = child->tree()->traverseNext(frame)) {
if (child->document() && child->document()->ownerElement())
scheduleNeedsStyleRecalc(child->document()->ownerElement());
}