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

Side by Side 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, 3 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2012 Apple Inc. All rights reserved. 2 * Copyright (C) 2012 Apple Inc. All rights reserved.
3 * Copyright (C) 2013 Google Inc. All rights reserved. 3 * Copyright (C) 2013 Google Inc. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are 6 * modification, are permitted provided that the following conditions are
7 * met: 7 * met:
8 * 8 *
9 * * Redistributions of source code must retain the above copyright 9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 28 matching lines...) Expand all
39 #include "core/inspector/InspectorState.h" 39 #include "core/inspector/InspectorState.h"
40 #include "core/inspector/InstrumentingAgents.h" 40 #include "core/inspector/InstrumentingAgents.h"
41 #include "core/loader/DocumentLoader.h" 41 #include "core/loader/DocumentLoader.h"
42 #include "core/page/Page.h" 42 #include "core/page/Page.h"
43 #include "core/platform/graphics/IntRect.h" 43 #include "core/platform/graphics/IntRect.h"
44 #include "core/platform/graphics/transforms/TransformationMatrix.h" 44 #include "core/platform/graphics/transforms/TransformationMatrix.h"
45 #include "core/rendering/RenderLayer.h" 45 #include "core/rendering/RenderLayer.h"
46 #include "core/rendering/RenderLayerBacking.h" 46 #include "core/rendering/RenderLayerBacking.h"
47 #include "core/rendering/RenderLayerCompositor.h" 47 #include "core/rendering/RenderLayerCompositor.h"
48 #include "core/rendering/RenderView.h" 48 #include "core/rendering/RenderView.h"
49 #include "public/platform/WebCompositingReasons.h"
49 #include "public/platform/WebLayer.h" 50 #include "public/platform/WebLayer.h"
50 51
51 namespace WebCore { 52 namespace WebCore {
52 53
53 namespace LayerTreeAgentState { 54 namespace LayerTreeAgentState {
54 static const char layerTreeAgentEnabled[] = "layerTreeAgentEnabled"; 55 static const char layerTreeAgentEnabled[] = "layerTreeAgentEnabled";
55 }; 56 };
56 57
57 static PassRefPtr<TypeBuilder::LayerTree::Layer> buildObjectForLayer(GraphicsLay er* graphicsLayer, int nodeId, bool forceRoot) 58 static PassRefPtr<TypeBuilder::LayerTree::Layer> buildObjectForLayer(GraphicsLay er* graphicsLayer, int nodeId, bool forceRoot)
58 { 59 {
59 RefPtr<TypeBuilder::LayerTree::Layer> layerObject = TypeBuilder::LayerTree:: Layer::create() 60 RefPtr<TypeBuilder::LayerTree::Layer> layerObject = TypeBuilder::LayerTree:: Layer::create()
60 .setLayerId(String::number(graphicsLayer->platformLayer()->id())) 61 .setLayerId(String::number(graphicsLayer->platformLayer()->id()))
61 .setNodeId(nodeId) 62 .setNodeId(nodeId)
62 .setOffsetX(graphicsLayer->position().x()) 63 .setOffsetX(graphicsLayer->position().x())
63 .setOffsetY(graphicsLayer->position().y()) 64 .setOffsetY(graphicsLayer->position().y())
64 .setWidth(graphicsLayer->size().width()) 65 .setWidth(graphicsLayer->size().width())
65 .setHeight(graphicsLayer->size().height()) 66 .setHeight(graphicsLayer->size().height())
66 .setPaintCount(graphicsLayer->repaintCount()); 67 .setPaintCount(graphicsLayer->paintCount());
67 68
68 // Artificially clip tree at root renger layer's graphic layer -- it might b e not the real 69 // Artificially clip tree at root render layer's graphic layer -- it might b e not the real
69 // root of graphics layer hierarchy, as platform adds containing layers (e.g . for overflosw scroll). 70 // root of graphics layer hierarchy, as platform adds containing layers (e.g . for frame scrolling).
70 if (graphicsLayer->parent() && !forceRoot) 71 if (!forceRoot) {
71 layerObject->setParentLayerId(String::number(graphicsLayer->parent()->pl atformLayer()->id())); 72 GraphicsLayer* parent = graphicsLayer->parent();
72 73 if (!parent)
74 parent = graphicsLayer->replicatedLayer();
75 if (parent)
76 layerObject->setParentLayerId(String::number(parent->platformLayer() ->id()));
77 }
73 const TransformationMatrix& transform = graphicsLayer->transform(); 78 const TransformationMatrix& transform = graphicsLayer->transform();
74 if (!transform.isIdentity()) { 79 if (!transform.isIdentity()) {
75 TransformationMatrix::FloatMatrix4 flattenedMatrix; 80 TransformationMatrix::FloatMatrix4 flattenedMatrix;
76 transform.toColumnMajorFloatArray(flattenedMatrix); 81 transform.toColumnMajorFloatArray(flattenedMatrix);
77 RefPtr<TypeBuilder::Array<double> > transformArray = TypeBuilder::Array< double>::create(); 82 RefPtr<TypeBuilder::Array<double> > transformArray = TypeBuilder::Array< double>::create();
78 for (size_t i = 0; i < WTF_ARRAY_LENGTH(flattenedMatrix); ++i) 83 for (size_t i = 0; i < WTF_ARRAY_LENGTH(flattenedMatrix); ++i)
79 transformArray->addItem(flattenedMatrix[i]); 84 transformArray->addItem(flattenedMatrix[i]);
80 layerObject->setTransform(transformArray); 85 layerObject->setTransform(transformArray);
81 const FloatPoint3D& anchor = graphicsLayer->anchorPoint(); 86 const FloatPoint3D& anchor = graphicsLayer->anchorPoint();
82 layerObject->setAnchorX(anchor.x()); 87 layerObject->setAnchorX(anchor.x());
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 149
145 void InspectorLayerTreeAgent::layerTreeDidChange() 150 void InspectorLayerTreeAgent::layerTreeDidChange()
146 { 151 {
147 m_frontend->layerTreeDidChange(); 152 m_frontend->layerTreeDidChange();
148 } 153 }
149 154
150 void InspectorLayerTreeAgent::getLayers(ErrorString* errorString, const int* nod eId, RefPtr<TypeBuilder::Array<TypeBuilder::LayerTree::Layer> >& layers) 155 void InspectorLayerTreeAgent::getLayers(ErrorString* errorString, const int* nod eId, RefPtr<TypeBuilder::Array<TypeBuilder::LayerTree::Layer> >& layers)
151 { 156 {
152 layers = TypeBuilder::Array<TypeBuilder::LayerTree::Layer>::create(); 157 layers = TypeBuilder::Array<TypeBuilder::LayerTree::Layer>::create();
153 158
154 RenderView* renderView = m_page->mainFrame()->contentRenderer(); 159 RenderLayerCompositor* compositor = renderLayerCompositor(errorString);
155 RenderLayerCompositor* compositor = renderView ? renderView->compositor() : 0; 160 if (!compositor)
156 if (!compositor) {
157 *errorString = "Not in compositing mode";
158 return; 161 return;
159 }
160 if (!nodeId) { 162 if (!nodeId) {
161 gatherLayersUsingRenderLayerHierarchy(errorString, compositor->rootRende rLayer(), layers); 163 gatherLayersUsingRenderLayerHierarchy(errorString, compositor->rootRende rLayer(), layers);
162 return; 164 return;
163 } 165 }
164 Node* node = m_instrumentingAgents->inspectorDOMAgent()->nodeForId(*nodeId); 166 Node* node = m_instrumentingAgents->inspectorDOMAgent()->nodeForId(*nodeId);
165 if (!node) { 167 if (!node) {
166 *errorString = "Provided node id doesn't match any known node"; 168 *errorString = "Provided node id doesn't match any known node";
167 return; 169 return;
168 } 170 }
169 RenderObject* renderer = node->renderer(); 171 RenderObject* renderer = node->renderer();
170 if (!renderer) { 172 if (!renderer) {
171 *errorString = "Node for provided node id doesn't have a renderer"; 173 *errorString = "Node for provided node id doesn't have a renderer";
172 return; 174 return;
173 } 175 }
174 gatherLayersUsingRenderObjectHierarchy(errorString, renderer, layers); 176 gatherLayersUsingRenderObjectHierarchy(errorString, renderer, layers);
175 } 177 }
176 178
177 void InspectorLayerTreeAgent::addRenderLayerBacking(ErrorString* errorString, Re nderLayerBacking* layerBacking, Node* node, RefPtr<TypeBuilder::Array<TypeBuilde r::LayerTree::Layer> >& layers) 179 void InspectorLayerTreeAgent::addRenderLayerBacking(ErrorString* errorString, Re nderLayerBacking* layerBacking, Node* node, RefPtr<TypeBuilder::Array<TypeBuilde r::LayerTree::Layer> >& layers)
178 { 180 {
179 int nodeId = idForNode(errorString, node); 181 int nodeId = idForNode(errorString, node);
180 RenderLayerCompositor* compositor = layerBacking->owningLayer()->compositor( );
181 bool forceRoot = layerBacking->owningLayer()->isRootLayer(); 182 bool forceRoot = layerBacking->owningLayer()->isRootLayer();
182 if (layerBacking->ancestorClippingLayer()) { 183 if (layerBacking->ancestorClippingLayer()) {
183 maybeAddGraphicsLayer(layerBacking->ancestorClippingLayer(), nodeId, lay ers, forceRoot); 184 maybeAddGraphicsLayer(layerBacking->ancestorClippingLayer(), nodeId, lay ers, forceRoot);
184 forceRoot = false; 185 forceRoot = false;
185 } 186 }
186 maybeAddGraphicsLayer(layerBacking->graphicsLayer(), nodeId, layers, forceRo ot); 187 maybeAddGraphicsLayer(layerBacking->graphicsLayer(), nodeId, layers, forceRo ot);
187 maybeAddGraphicsLayer(layerBacking->clippingLayer(), nodeId, layers); 188 maybeAddGraphicsLayer(layerBacking->clippingLayer(), nodeId, layers);
188 maybeAddGraphicsLayer(layerBacking->foregroundLayer(), nodeId, layers); 189 maybeAddGraphicsLayer(layerBacking->foregroundLayer(), nodeId, layers);
189 maybeAddGraphicsLayer(layerBacking->backgroundLayer(), nodeId, layers); 190 maybeAddGraphicsLayer(layerBacking->backgroundLayer(), nodeId, layers);
190 maybeAddGraphicsLayer(layerBacking->scrollingLayer(), nodeId, layers); 191 maybeAddGraphicsLayer(layerBacking->scrollingLayer(), nodeId, layers);
(...skipping 27 matching lines...) Expand all
218 { 219 {
219 InspectorDOMAgent* domAgent = m_instrumentingAgents->inspectorDOMAgent(); 220 InspectorDOMAgent* domAgent = m_instrumentingAgents->inspectorDOMAgent();
220 221
221 int nodeId = domAgent->boundNodeId(node); 222 int nodeId = domAgent->boundNodeId(node);
222 if (!nodeId) 223 if (!nodeId)
223 nodeId = domAgent->pushNodeToFrontend(errorString, domAgent->boundNodeId (node->document()), node); 224 nodeId = domAgent->pushNodeToFrontend(errorString, domAgent->boundNodeId (node->document()), node);
224 225
225 return nodeId; 226 return nodeId;
226 } 227 }
227 228
229 RenderLayerCompositor* InspectorLayerTreeAgent::renderLayerCompositor(ErrorStrin g* errorString)
230 {
231 RenderView* renderView = m_page->mainFrame()->contentRenderer();
232 RenderLayerCompositor* compositor = renderView ? renderView->compositor() : 0;
233 if (!compositor)
234 *errorString = "Not in the compositing mode";
235 return compositor;
236 }
237
238 static GraphicsLayer* findLayerById(GraphicsLayer* root, int layerId)
239 {
240 if (root->platformLayer()->id() == layerId)
241 return root;
242 for (size_t i = 0, size = root->children().size(); i < size; ++i) {
243 if (GraphicsLayer* layer = findLayerById(root->children()[i], layerId))
244 return layer;
245 }
246 return 0;
247 }
248
249 GraphicsLayer* InspectorLayerTreeAgent::layerById(ErrorString* errorString, cons t String& layerId)
250 {
251 bool ok;
252 int id = layerId.toInt(&ok);
253 if (!ok) {
254 *errorString = "Invalid layer id";
255 return 0;
256 }
257 RenderLayerCompositor* compositor = renderLayerCompositor(errorString);
258 if (!compositor)
259 return 0;
260
261 GraphicsLayer* result = findLayerById(compositor->rootGraphicsLayer(), id);
262 if (!result)
263 *errorString = "No layer matching given id found";
264 return result;
265 }
266
267 struct CompositingReasonToProtocolName {
268 uint64_t mask;
269 const char *protocolName;
270 };
271
272
273 void InspectorLayerTreeAgent::compositingReasons(ErrorString* errorString, const String& layerId, RefPtr<TypeBuilder::Array<String> >& reasonStrings)
274 {
275 static CompositingReasonToProtocolName compositingReasonNames[] = {
276 { CompositingReason3DTransform, "transform3D" },
277 { CompositingReasonVideo, "video" },
278 { CompositingReasonCanvas, "canvas" },
279 { CompositingReasonPlugin, "plugin" },
280 { CompositingReasonIFrame, "iFrame" },
281 { CompositingReasonBackfaceVisibilityHidden, "backfaceVisibilityHidden" },
282 { CompositingReasonAnimation, "animation" },
283 { CompositingReasonFilters, "filters" },
284 { CompositingReasonPositionFixed, "positionFixed" },
285 { CompositingReasonPositionSticky, "positionSticky" },
286 { CompositingReasonOverflowScrollingTouch, "overflowScrollingTouch" },
287 { CompositingReasonAssumedOverlap, "assumedOverlap" },
288 { CompositingReasonOverlap, "overlap" },
289 { CompositingReasonNegativeZIndexChildren, "negativeZIndexChildren" },
290 { CompositingReasonTransformWithCompositedDescendants, "transformWithCom positedDescendants" },
291 { CompositingReasonOpacityWithCompositedDescendants, "opacityWithComposi tedDescendants" },
292 { CompositingReasonMaskWithCompositedDescendants, "maskWithCompositedDes cendants" },
293 { CompositingReasonReflectionWithCompositedDescendants, "reflectionWithC ompositedDescendants" },
294 { CompositingReasonFilterWithCompositedDescendants, "filterWithComposite dDescendants" },
295 { CompositingReasonBlendingWithCompositedDescendants, "blendingWithCompo sitedDescendants" },
296 { CompositingReasonClipsCompositingDescendants, "clipsCompositingDescend ants" },
297 { CompositingReasonPerspective, "perspective" },
298 { CompositingReasonPreserve3D, "preserve3D" },
299 { CompositingReasonRoot, "root" },
300 { CompositingReasonLayerForClip, "layerForClip" },
301 { CompositingReasonLayerForScrollbar, "layerForScrollbar" },
302 { CompositingReasonLayerForScrollingContainer, "layerForScrollingContain er" },
303 { CompositingReasonLayerForForeground, "layerForForeground" },
304 { CompositingReasonLayerForBackground, "layerForBackground" },
305 { CompositingReasonLayerForMask, "layerForMask" },
306 { CompositingReasonLayerForVideoOverlay, "layerForVideoOverlay" }
307 };
308
309 const GraphicsLayer* graphicsLayer = layerById(errorString, layerId);
310 if (!graphicsLayer)
311 return;
312 WebKit::WebCompositingReasons reasonsBitmask = graphicsLayer->compositingRea sons();
313 reasonStrings = TypeBuilder::Array<String>::create();
314 for (size_t i = 0; i < WTF_ARRAY_LENGTH(compositingReasonNames); ++i) {
315 if (!(reasonsBitmask & compositingReasonNames[i].mask))
316 continue;
317 reasonStrings->addItem(compositingReasonNames[i].protocolName);
318 #ifndef _NDEBUG
319 reasonsBitmask &= ~compositingReasonNames[i].mask;
320 #endif
321 }
322 ASSERT(!reasonsBitmask);
323 }
324
228 } // namespace WebCore 325 } // namespace WebCore
OLDNEW
« 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