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

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: fixed gcc build 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
« no previous file with comments | « Source/core/inspector/InspectorLayerTreeAgent.h ('k') | Source/core/platform/graphics/GraphicsLayer.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/inspector/InspectorLayerTreeAgent.cpp
diff --git a/Source/core/inspector/InspectorLayerTreeAgent.cpp b/Source/core/inspector/InspectorLayerTreeAgent.cpp
index 3a7ab1d5bfb8b7d41f89ed3032ac25c87844b005..43fa044565f92f68e6d70a4ccd83dcf18eb65149 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());
-
- // 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).
- if (graphicsLayer->parent() && !forceRoot)
- layerObject->setParentLayerId(String::number(graphicsLayer->parent()->platformLayer()->id()));
+ .setPaintCount(graphicsLayer->paintCount());
+ // Artificially clip tree at root render layer's graphic layer -- it might be not the real
+ // root of graphics layer hierarchy, as platform adds containing layers (e.g. for frame scrolling).
+ 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,12 +156,9 @@ 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;
- if (!compositor) {
- *errorString = "Not in compositing mode";
+ RenderLayerCompositor* compositor = renderLayerCompositor(errorString);
+ if (!compositor)
return;
- }
if (!nodeId) {
gatherLayersUsingRenderLayerHierarchy(errorString, compositor->rootRenderLayer(), layers);
return;
@@ -177,7 +179,6 @@ 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();
bool forceRoot = layerBacking->owningLayer()->isRootLayer();
if (layerBacking->ancestorClippingLayer()) {
maybeAddGraphicsLayer(layerBacking->ancestorClippingLayer(), nodeId, layers, forceRoot);
@@ -225,4 +226,100 @@ 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;
+}
+
+static GraphicsLayer* findLayerById(GraphicsLayer* root, int layerId)
+{
+ if (root->platformLayer()->id() == layerId)
+ return root;
+ for (size_t i = 0, size = root->children().size(); i < size; ++i) {
+ if (GraphicsLayer* layer = findLayerById(root->children()[i], layerId))
+ return layer;
+ }
+ return 0;
+}
+
+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;
+
+ GraphicsLayer* result = findLayerById(compositor->rootGraphicsLayer(), id);
+ if (!result)
+ *errorString = "No layer matching given id found";
+ return result;
+}
+
+struct CompositingReasonToProtocolName {
+ uint64_t mask;
+ const char *protocolName;
+};
+
+
+void InspectorLayerTreeAgent::compositingReasons(ErrorString* errorString, const String& layerId, RefPtr<TypeBuilder::Array<String> >& reasonStrings)
+{
+ static CompositingReasonToProtocolName compositingReasonNames[] = {
+ { CompositingReason3DTransform, "transform3D" },
+ { CompositingReasonVideo, "video" },
+ { CompositingReasonCanvas, "canvas" },
+ { CompositingReasonPlugin, "plugin" },
+ { CompositingReasonIFrame, "iFrame" },
+ { CompositingReasonBackfaceVisibilityHidden, "backfaceVisibilityHidden" },
+ { CompositingReasonAnimation, "animation" },
+ { CompositingReasonFilters, "filters" },
+ { CompositingReasonPositionFixed, "positionFixed" },
+ { CompositingReasonPositionSticky, "positionSticky" },
+ { CompositingReasonOverflowScrollingTouch, "overflowScrollingTouch" },
+ { CompositingReasonAssumedOverlap, "assumedOverlap" },
+ { CompositingReasonOverlap, "overlap" },
+ { CompositingReasonNegativeZIndexChildren, "negativeZIndexChildren" },
+ { CompositingReasonTransformWithCompositedDescendants, "transformWithCompositedDescendants" },
+ { CompositingReasonOpacityWithCompositedDescendants, "opacityWithCompositedDescendants" },
+ { CompositingReasonMaskWithCompositedDescendants, "maskWithCompositedDescendants" },
+ { CompositingReasonReflectionWithCompositedDescendants, "reflectionWithCompositedDescendants" },
+ { CompositingReasonFilterWithCompositedDescendants, "filterWithCompositedDescendants" },
+ { CompositingReasonBlendingWithCompositedDescendants, "blendingWithCompositedDescendants" },
+ { CompositingReasonClipsCompositingDescendants, "clipsCompositingDescendants" },
+ { CompositingReasonPerspective, "perspective" },
+ { CompositingReasonPreserve3D, "preserve3D" },
+ { CompositingReasonRoot, "root" },
+ { CompositingReasonLayerForClip, "layerForClip" },
+ { CompositingReasonLayerForScrollbar, "layerForScrollbar" },
+ { CompositingReasonLayerForScrollingContainer, "layerForScrollingContainer" },
+ { CompositingReasonLayerForForeground, "layerForForeground" },
+ { CompositingReasonLayerForBackground, "layerForBackground" },
+ { CompositingReasonLayerForMask, "layerForMask" },
+ { CompositingReasonLayerForVideoOverlay, "layerForVideoOverlay" }
+ };
+
+ const GraphicsLayer* graphicsLayer = layerById(errorString, layerId);
+ if (!graphicsLayer)
+ return;
+ WebKit::WebCompositingReasons reasonsBitmask = graphicsLayer->compositingReasons();
+ reasonStrings = TypeBuilder::Array<String>::create();
+ for (size_t i = 0; i < WTF_ARRAY_LENGTH(compositingReasonNames); ++i) {
+ if (!(reasonsBitmask & compositingReasonNames[i].mask))
+ continue;
+ reasonStrings->addItem(compositingReasonNames[i].protocolName);
+#ifndef _NDEBUG
+ reasonsBitmask &= ~compositingReasonNames[i].mask;
+#endif
+ }
+ ASSERT(!reasonsBitmask);
+}
+
} // namespace WebCore
« no previous file with comments | « Source/core/inspector/InspectorLayerTreeAgent.h ('k') | Source/core/platform/graphics/GraphicsLayer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698