PassRefPtr<JSONObject> GraphicsLayer::layerTreeAsJSON(LayerTreeFlags flags, RenderingContextMap& renderingContextMap) const { RefPtr<JSONObject> json = adoptRef(new JSONObject); if (flags & LayerTreeIncludesDebugInfo) { json->setString("this", pointerAsString(this)); json->setString("debugName", m_client->debugName(this)); } if (m_position != FloatPoint()) json->setArray("position", pointAsJSONArray(m_position)); if (m_hasTransformOrigin && m_transformOrigin != FloatPoint3D(m_size.width() * 0.5f, m_size.height() * 0.5f, 0)) json->setArray("transformOrigin", pointAsJSONArray(m_transformOrigin)); if (m_size != IntSize()) json->setArray("bounds", sizeAsJSONArray(m_size)); if (m_opacity != 1) json->setNumber("opacity", m_opacity); if (m_blendMode != WebBlendModeNormal) json->setString("blendMode", compositeOperatorName(CompositeSourceOver, m_blendMode)); if (m_isRootForIsolatedGroup) json->setBoolean("isolate", m_isRootForIsolatedGroup); if (m_contentsOpaque) json->setBoolean("contentsOpaque", m_contentsOpaque); if (!m_shouldFlattenTransform) json->setBoolean("shouldFlattenTransform", m_shouldFlattenTransform); if (m_3dRenderingContext) { RenderingContextMap::const_iterator it = renderingContextMap.find(m_3dRenderingContext); int contextId = renderingContextMap.size() + 1; if (it == renderingContextMap.end()) renderingContextMap.set(m_3dRenderingContext, contextId); else contextId = it->value; json->setNumber("3dRenderingContext", contextId); } if (m_drawsContent) json->setBoolean("drawsContent", m_drawsContent); if (!m_contentsVisible) json->setBoolean("contentsVisible", m_contentsVisible); if (!m_backfaceVisibility) json->setString("backfaceVisibility", m_backfaceVisibility ? "visible" : "hidden"); if (flags & LayerTreeIncludesDebugInfo) json->setString("client", pointerAsString(m_client)); if (m_backgroundColor.alpha()) json->setString("backgroundColor", m_backgroundColor.nameForRenderTreeAsText()); if (!m_transform.isIdentity()) json->setArray("transform", transformAsJSONArray(m_transform)); if (m_replicaLayer) json->setObject("replicaLayer", m_replicaLayer->layerTreeAsJSON(flags, renderingContextMap)); if (m_replicatedLayer) json->setString("replicatedLayer", flags & LayerTreeIncludesDebugInfo ? pointerAsString(m_replicatedLayer) : ""); if ((flags & LayerTreeIncludesPaintInvalidationRects) && repaintRectMap().contains(this) && !repaintRectMap().get(this).isEmpty()) { Vector<FloatRect> repaintRectsCopy = repaintRectMap().get(this); std::sort(repaintRectsCopy.begin(), repaintRectsCopy.end(), &compareFloatRects); RefPtr<JSONArray> repaintRectsJSON = adoptRef(new JSONArray); for (size_t i = 0; i < repaintRectsCopy.size(); ++i) { if (repaintRectsCopy[i].isEmpty()) continue; repaintRectsJSON->pushArray(rectAsJSONArray(repaintRectsCopy[i])); } json->setArray("repaintRects", repaintRectsJSON); } if ((flags & LayerTreeIncludesPaintingPhases) && m_paintingPhase) { RefPtr<JSONArray> paintingPhasesJSON = adoptRef(new JSONArray); if (m_paintingPhase & GraphicsLayerPaintBackground) paintingPhasesJSON->pushString("GraphicsLayerPaintBackground"); if (m_paintingPhase & GraphicsLayerPaintForeground) paintingPhasesJSON->pushString("GraphicsLayerPaintForeground"); if (m_paintingPhase & GraphicsLayerPaintMask) paintingPhasesJSON->pushString("GraphicsLayerPaintMask"); if (m_paintingPhase & GraphicsLayerPaintChildClippingMask) paintingPhasesJSON->pushString("GraphicsLayerPaintChildClippingMask"); if (m_paintingPhase & GraphicsLayerPaintOverflowContents) paintingPhasesJSON->pushString("GraphicsLayerPaintOverflowContents"); if (m_paintingPhase & GraphicsLayerPaintCompositedScroll) paintingPhasesJSON->pushString("GraphicsLayerPaintCompositedScroll"); json->setArray("paintingPhases", paintingPhasesJSON); } if (flags & LayerTreeIncludesClipAndScrollParents) { if (m_hasScrollParent) json->setBoolean("hasScrollParent", true); if (m_hasClipParent) json->setBoolean("hasClipParent", true); } if (flags & LayerTreeIncludesDebugInfo) { RefPtr<JSONArray> compositingReasonsJSON = adoptRef(new JSONArray); for (size_t i = 0; i < kNumberOfCompositingReasons; ++i) { if (m_debugInfo.compositingReasons() & kCompositingReasonStringMap[i].reason) compositingReasonsJSON->pushString(kCompositingReasonStringMap[i].description); } json->setArray("compositingReasons", compositingReasonsJSON); } if (m_children.size()) { RefPtr<JSONArray> childrenJSON = adoptRef(new JSONArray); for (size_t i = 0; i < m_children.size(); i++) childrenJSON->pushObject(m_children[i]->layerTreeAsJSON(flags, renderingContextMap)); json->setArray("children", childrenJSON); } return json; }
void GraphicsLayer::dumpProperties(TextStream& ts, int indent, LayerTreeFlags flags, RenderingContextMap& renderingContextMap) const { if (m_position != FloatPoint()) { writeIndent(ts, indent + 1); ts << "(position " << m_position.x() << " " << m_position.y() << ")\n"; } if (m_boundsOrigin != FloatPoint()) { writeIndent(ts, indent + 1); ts << "(bounds origin " << m_boundsOrigin.x() << " " << m_boundsOrigin.y() << ")\n"; } if (m_anchorPoint != FloatPoint3D(0.5f, 0.5f, 0)) { writeIndent(ts, indent + 1); ts << "(anchor " << m_anchorPoint.x() << " " << m_anchorPoint.y() << ")\n"; } if (m_size != IntSize()) { writeIndent(ts, indent + 1); ts << "(bounds " << m_size.width() << " " << m_size.height() << ")\n"; } if (m_opacity != 1) { writeIndent(ts, indent + 1); ts << "(opacity " << m_opacity << ")\n"; } if (m_blendMode != blink::WebBlendModeNormal) { writeIndent(ts, indent + 1); ts << "(blendMode " << compositeOperatorName(CompositeSourceOver, m_blendMode) << ")\n"; } if (m_isRootForIsolatedGroup) { writeIndent(ts, indent + 1); ts << "(isolate " << m_isRootForIsolatedGroup << ")\n"; } if (m_contentsOpaque) { writeIndent(ts, indent + 1); ts << "(contentsOpaque " << m_contentsOpaque << ")\n"; } if (!m_shouldFlattenTransform) { writeIndent(ts, indent + 1); ts << "(shouldFlattenTransform " << m_shouldFlattenTransform << ")\n"; } if (m_3dRenderingContext) { RenderingContextMap::const_iterator it = renderingContextMap.find(m_3dRenderingContext); int contextId = renderingContextMap.size() + 1; if (it == renderingContextMap.end()) renderingContextMap.set(m_3dRenderingContext, contextId); else contextId = it->value; writeIndent(ts, indent + 1); ts << "(3dRenderingContext " << contextId << ")\n"; } if (m_drawsContent) { writeIndent(ts, indent + 1); ts << "(drawsContent " << m_drawsContent << ")\n"; } if (!m_contentsVisible) { writeIndent(ts, indent + 1); ts << "(contentsVisible " << m_contentsVisible << ")\n"; } if (!m_backfaceVisibility) { writeIndent(ts, indent + 1); ts << "(backfaceVisibility " << (m_backfaceVisibility ? "visible" : "hidden") << ")\n"; } if (flags & LayerTreeIncludesDebugInfo) { writeIndent(ts, indent + 1); ts << "("; if (m_client) ts << "client " << static_cast<void*>(m_client); else ts << "no client"; ts << ")\n"; } if (m_backgroundColor.alpha()) { writeIndent(ts, indent + 1); ts << "(backgroundColor " << m_backgroundColor.nameForRenderTreeAsText() << ")\n"; } if (!m_transform.isIdentity()) { writeIndent(ts, indent + 1); ts << "(transform "; ts << "[" << m_transform.m11() << " " << m_transform.m12() << " " << m_transform.m13() << " " << m_transform.m14() << "] "; ts << "[" << m_transform.m21() << " " << m_transform.m22() << " " << m_transform.m23() << " " << m_transform.m24() << "] "; ts << "[" << m_transform.m31() << " " << m_transform.m32() << " " << m_transform.m33() << " " << m_transform.m34() << "] "; ts << "[" << m_transform.m41() << " " << m_transform.m42() << " " << m_transform.m43() << " " << m_transform.m44() << "])\n"; } if (m_replicaLayer) { writeIndent(ts, indent + 1); ts << "(replica layer"; if (flags & LayerTreeIncludesDebugInfo) ts << " " << m_replicaLayer; ts << ")\n"; m_replicaLayer->dumpLayer(ts, indent + 2, flags, renderingContextMap); } if (m_replicatedLayer) { writeIndent(ts, indent + 1); ts << "(replicated layer"; if (flags & LayerTreeIncludesDebugInfo) ts << " " << m_replicatedLayer; ts << ")\n"; } if ((flags & LayerTreeIncludesRepaintRects) && repaintRectMap().contains(this) && !repaintRectMap().get(this).isEmpty()) { writeIndent(ts, indent + 1); ts << "(repaint rects\n"; for (size_t i = 0; i < repaintRectMap().get(this).size(); ++i) { if (repaintRectMap().get(this)[i].isEmpty()) continue; writeIndent(ts, indent + 2); ts << "(rect "; ts << repaintRectMap().get(this)[i].x() << " "; ts << repaintRectMap().get(this)[i].y() << " "; ts << repaintRectMap().get(this)[i].width() << " "; ts << repaintRectMap().get(this)[i].height(); ts << ")\n"; } writeIndent(ts, indent + 1); ts << ")\n"; } if ((flags & LayerTreeIncludesPaintingPhases) && paintingPhase()) { writeIndent(ts, indent + 1); ts << "(paintingPhases\n"; if (paintingPhase() & GraphicsLayerPaintBackground) { writeIndent(ts, indent + 2); ts << "GraphicsLayerPaintBackground\n"; } if (paintingPhase() & GraphicsLayerPaintForeground) { writeIndent(ts, indent + 2); ts << "GraphicsLayerPaintForeground\n"; } if (paintingPhase() & GraphicsLayerPaintMask) { writeIndent(ts, indent + 2); ts << "GraphicsLayerPaintMask\n"; } if (paintingPhase() & GraphicsLayerPaintChildClippingMask) { writeIndent(ts, indent + 2); ts << "GraphicsLayerPaintChildClippingMask\n"; } if (paintingPhase() & GraphicsLayerPaintOverflowContents) { writeIndent(ts, indent + 2); ts << "GraphicsLayerPaintOverflowContents\n"; } if (paintingPhase() & GraphicsLayerPaintCompositedScroll) { writeIndent(ts, indent + 2); ts << "GraphicsLayerPaintCompositedScroll\n"; } writeIndent(ts, indent + 1); ts << ")\n"; } if (flags & LayerTreeIncludesClipAndScrollParents) { if (m_hasScrollParent) { writeIndent(ts, indent + 1); ts << "(hasScrollParent 1)\n"; } if (m_hasClipParent) { writeIndent(ts, indent + 1); ts << "(hasClipParent 1)\n"; } } if (flags & LayerTreeIncludesDebugInfo) { writeIndent(ts, indent + 1); ts << "(compositingReasons\n"; for (size_t i = 0; i < WTF_ARRAY_LENGTH(compositingReasonStringMap); ++i) { if (m_debugInfo.compositingReasons() & compositingReasonStringMap[i].reason) { writeIndent(ts, indent + 2); ts << compositingReasonStringMap[i].description << "\n"; } } writeIndent(ts, indent + 1); ts << ")\n"; } if (m_children.size()) { writeIndent(ts, indent + 1); ts << "(children " << m_children.size() << "\n"; unsigned i; for (i = 0; i < m_children.size(); i++) m_children[i]->dumpLayer(ts, indent + 2, flags, renderingContextMap); writeIndent(ts, indent + 1); ts << ")\n"; } }