Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(662)

Unified Diff: Source/core/inspector/InspectorLayerTreeAgent.cpp

Issue 23050018: DevTools: expose layer compositing reasons and paint count via layer tree agent (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698