Index: Source/core/inspector/InspectorLayerTreeAgent.cpp |
diff --git a/Source/core/inspector/InspectorLayerTreeAgent.cpp b/Source/core/inspector/InspectorLayerTreeAgent.cpp |
index 3a7ab1d5bfb8b7d41f89ed3032ac25c87844b005..722964d7c43d9575e2a9c12c6d4823cf9208e5ba 100644 |
--- a/Source/core/inspector/InspectorLayerTreeAgent.cpp |
+++ b/Source/core/inspector/InspectorLayerTreeAgent.cpp |
@@ -46,6 +46,7 @@ |
#include "core/rendering/RenderLayerBacking.h" |
#include "core/rendering/RenderLayerCompositor.h" |
#include "core/rendering/RenderView.h" |
+#include "public/platform/WebCompositingReasons.h" |
#include "public/platform/WebLayer.h" |
namespace WebCore { |
@@ -63,13 +64,17 @@ static PassRefPtr<TypeBuilder::LayerTree::Layer> buildObjectForLayer(GraphicsLay |
.setOffsetY(graphicsLayer->position().y()) |
.setWidth(graphicsLayer->size().width()) |
.setHeight(graphicsLayer->size().height()) |
- .setPaintCount(graphicsLayer->repaintCount()); |
+ .setPaintCount(graphicsLayer->paintCount()); |
// Artificially clip tree at root renger layer's graphic layer -- it might be not the real |
// root of graphics layer hierarchy, as platform adds containing layers (e.g. for overflosw scroll). |
trchen
2013/08/22 23:02:35
I knew you didn't add this, but this comment is fu
|
- if (graphicsLayer->parent() && !forceRoot) |
- layerObject->setParentLayerId(String::number(graphicsLayer->parent()->platformLayer()->id())); |
- |
+ if (!forceRoot) { |
+ GraphicsLayer* parent = graphicsLayer->parent(); |
+ if (!parent) |
+ parent = graphicsLayer->replicatedLayer(); |
+ if (parent) |
+ layerObject->setParentLayerId(String::number(parent->platformLayer()->id())); |
+ } |
const TransformationMatrix& transform = graphicsLayer->transform(); |
if (!transform.isIdentity()) { |
TransformationMatrix::FloatMatrix4 flattenedMatrix; |
@@ -151,8 +156,7 @@ void InspectorLayerTreeAgent::getLayers(ErrorString* errorString, const int* nod |
{ |
layers = TypeBuilder::Array<TypeBuilder::LayerTree::Layer>::create(); |
- RenderView* renderView = m_page->mainFrame()->contentRenderer(); |
- RenderLayerCompositor* compositor = renderView ? renderView->compositor() : 0; |
+ RenderLayerCompositor* compositor = renderLayerCompositor(errorString); |
if (!compositor) { |
*errorString = "Not in compositing mode"; |
trchen
2013/08/22 23:02:35
errorString is already set.
|
return; |
@@ -177,7 +181,7 @@ void InspectorLayerTreeAgent::getLayers(ErrorString* errorString, const int* nod |
void InspectorLayerTreeAgent::addRenderLayerBacking(ErrorString* errorString, RenderLayerBacking* layerBacking, Node* node, RefPtr<TypeBuilder::Array<TypeBuilder::LayerTree::Layer> >& layers) |
{ |
int nodeId = idForNode(errorString, node); |
- RenderLayerCompositor* compositor = layerBacking->owningLayer()->compositor(); |
+ RenderLayerCompositor* compositor = renderLayerCompositor(errorString); |
trchen
2013/08/22 23:02:35
Unused. Can we remove this variable?
|
bool forceRoot = layerBacking->owningLayer()->isRootLayer(); |
if (layerBacking->ancestorClippingLayer()) { |
maybeAddGraphicsLayer(layerBacking->ancestorClippingLayer(), nodeId, layers, forceRoot); |
@@ -225,4 +229,142 @@ int InspectorLayerTreeAgent::idForNode(ErrorString* errorString, Node* node) |
return nodeId; |
} |
+RenderLayerCompositor* InspectorLayerTreeAgent::renderLayerCompositor(ErrorString* errorString) |
+{ |
+ RenderView* renderView = m_page->mainFrame()->contentRenderer(); |
+ RenderLayerCompositor* compositor = renderView ? renderView->compositor() : 0; |
+ if (!compositor) |
+ *errorString = "Not in the compositing mode"; |
+ return compositor; |
+} |
+ |
+GraphicsLayer* InspectorLayerTreeAgent::layerById(ErrorString* errorString, const String& layerId) |
+{ |
+ bool ok; |
+ int id = layerId.toInt(&ok); |
+ if (!ok) { |
+ *errorString = "Invalid layer id"; |
+ return 0; |
+ } |
+ RenderLayerCompositor* compositor = renderLayerCompositor(errorString); |
+ if (!compositor) |
+ return 0; |
+ Vector<std::pair<GraphicsLayer*, size_t> > stack; |
trchen
2013/08/22 23:02:35
Any reason why not use recursion here?
|
+ stack.append(std::make_pair(compositor->rootGraphicsLayer(), 0)); |
+ while (!stack.isEmpty()) { |
+ GraphicsLayer* layer = stack.last().first; |
+ size_t& childIndex = stack.last().second; |
+ if (childIndex < layer->children().size()) { |
+ stack.append(std::make_pair(layer->children()[childIndex], 0)); |
+ childIndex++; |
+ continue; |
+ } |
+ if (layer->platformLayer()->id() == id) |
+ return layer; |
+ stack.removeLast(); |
+ } |
+ *errorString = "No layer matching given id found"; |
+ return 0; |
+} |
+ |
+void InspectorLayerTreeAgent::reasonsForCompositingLayer(ErrorString* errorString, const String& layerId, RefPtr<TypeBuilder::LayerTree::CompositingReasons>& compositingReasons) |
+{ |
+ const GraphicsLayer* graphicsLayer = layerById(errorString, layerId); |
+ if (!graphicsLayer) |
+ return; |
+ |
+ WebKit::WebCompositingReasons reasonsBitmask = graphicsLayer->compositingReasons(); |
+ compositingReasons = TypeBuilder::LayerTree::CompositingReasons::create(); |
+ |
+ if (reasonsBitmask & CompositingReason3DTransform) |
+ compositingReasons->setTransform3D(true); |
+ |
+ if (reasonsBitmask & CompositingReasonVideo) |
+ compositingReasons->setVideo(true); |
+ else if (reasonsBitmask & CompositingReasonCanvas) |
+ compositingReasons->setCanvas(true); |
+ else if (reasonsBitmask & CompositingReasonPlugin) |
+ compositingReasons->setPlugin(true); |
+ else if (reasonsBitmask & CompositingReasonIFrame) |
+ compositingReasons->setIFrame(true); |
+ |
+ if (reasonsBitmask & CompositingReasonBackfaceVisibilityHidden) |
+ compositingReasons->setBackfaceVisibilityHidden(true); |
+ |
+ if (reasonsBitmask & CompositingReasonAnimation) |
+ compositingReasons->setAnimation(true); |
+ |
+ if (reasonsBitmask & CompositingReasonFilters) |
+ compositingReasons->setFilters(true); |
+ |
+ if (reasonsBitmask & CompositingReasonPositionFixed) |
+ compositingReasons->setPositionFixed(true); |
+ |
+ if (reasonsBitmask & CompositingReasonPositionSticky) |
+ compositingReasons->setPositionSticky(true); |
+ |
+ if (reasonsBitmask & CompositingReasonOverflowScrollingTouch) |
+ compositingReasons->setOverflowScrollingTouch(true); |
+ |
+ if (reasonsBitmask & CompositingReasonAssumedOverlap) |
+ compositingReasons->setAssumedOverlap(true); |
+ |
+ if (reasonsBitmask & CompositingReasonOverlap) |
+ compositingReasons->setOverlap(true); |
+ |
+ if (reasonsBitmask & CompositingReasonNegativeZIndexChildren) |
+ compositingReasons->setNegativeZIndexChildren(true); |
+ |
+ if (reasonsBitmask & CompositingReasonTransformWithCompositedDescendants) |
+ compositingReasons->setTransformWithCompositedDescendants(true); |
+ |
+ if (reasonsBitmask & CompositingReasonOpacityWithCompositedDescendants) |
+ compositingReasons->setOpacityWithCompositedDescendants(true); |
+ |
+ if (reasonsBitmask & CompositingReasonMaskWithCompositedDescendants) |
+ compositingReasons->setMaskWithCompositedDescendants(true); |
+ |
+ if (reasonsBitmask & CompositingReasonReflectionWithCompositedDescendants) |
+ compositingReasons->setReflectionWithCompositedDescendants(true); |
+ |
+ if (reasonsBitmask & CompositingReasonFilterWithCompositedDescendants) |
+ compositingReasons->setFilterWithCompositedDescendants(true); |
+ |
+ if (reasonsBitmask & CompositingReasonBlendingWithCompositedDescendants) |
+ compositingReasons->setBlendingWithCompositedDescendants(true); |
+ |
+ if (reasonsBitmask & CompositingReasonClipsCompositingDescendants) |
+ compositingReasons->setClipsCompositingDescendants(true); |
+ |
+ if (reasonsBitmask & CompositingReasonPerspective) |
+ compositingReasons->setPerspective(true); |
+ |
+ if (reasonsBitmask & CompositingReasonPreserve3D) |
+ compositingReasons->setPreserve3D(true); |
+ |
+ if (reasonsBitmask & CompositingReasonRoot) |
+ compositingReasons->setRoot(true); |
+ |
+ if (reasonsBitmask & CompositingReasonLayerForClip) |
+ compositingReasons->setLayerForClip(true); |
+ |
+ if (reasonsBitmask & CompositingReasonLayerForScrollbar) |
+ compositingReasons->setLayerForScrollbar(true); |
+ |
+ if (reasonsBitmask & CompositingReasonLayerForScrollingContainer) |
+ compositingReasons->setLayerForScrollingContainer(true); |
+ |
+ if (reasonsBitmask & CompositingReasonLayerForForeground) |
+ compositingReasons->setLayerForForeground(true); |
+ |
+ if (reasonsBitmask & CompositingReasonLayerForBackground) |
+ compositingReasons->setLayerForBackground(true); |
+ |
+ if (reasonsBitmask & CompositingReasonLayerForMask) |
+ compositingReasons->setLayerForMask(true); |
+ |
+ if (reasonsBitmask & CompositingReasonLayerForVideoOverlay) |
+ compositingReasons->setLayerForVideoOverlay(true); |
+} |
+ |
} // namespace WebCore |