Chromium Code Reviews| 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 |