Index: Source/core/inspector/InspectorLayerTreeAgent.cpp |
diff --git a/Source/core/inspector/InspectorLayerTreeAgent.cpp b/Source/core/inspector/InspectorLayerTreeAgent.cpp |
index 55762f82a85252a9ec973787903f0917f7d238f0..aff16e1457bc503214d053b144aa13030c2a4a0a 100644 |
--- a/Source/core/inspector/InspectorLayerTreeAgent.cpp |
+++ b/Source/core/inspector/InspectorLayerTreeAgent.cpp |
@@ -73,6 +73,44 @@ inline String idForLayer(const GraphicsLayer* graphicsLayer) |
return String::number(graphicsLayer->platformLayer()->id()); |
} |
+static void buildRegionObjects(const blink::WebVector<blink::WebRect>& regions, |
+ TypeBuilder::Array<TypeBuilder::LayerTree::ScrollRect>& scrollRects, |
+ const TypeBuilder::LayerTree::ScrollRect::Type::Enum& type, |
+ const TypeBuilder::LayerTree::LayerId& layerId) |
+{ |
+ for (size_t i = 0; i < regions.size(); ++i) { |
+ RefPtr<TypeBuilder::DOM::Rect> rectObject = TypeBuilder::DOM::Rect::create() |
+ .setX(regions[i].x) |
+ .setY(regions[i].y) |
+ .setHeight(regions[i].height) |
+ .setWidth(regions[i].width); |
+ RefPtr<TypeBuilder::LayerTree::ScrollRect> regionObject = TypeBuilder::LayerTree::ScrollRect::create() |
+ .setRect(rectObject) |
+ .setType(type); |
+ scrollRects.addItem(regionObject); |
+ } |
+} |
+ |
+static PassRefPtr<TypeBuilder::Array<TypeBuilder::LayerTree::ScrollRect> > buildScrollRectsForLayer(GraphicsLayer* graphicsLayer) |
+{ |
+ RefPtr<TypeBuilder::Array<TypeBuilder::LayerTree::ScrollRect> > scrollRects = TypeBuilder::Array<TypeBuilder::LayerTree::ScrollRect>::create(); |
+ blink::WebLayer* webLayer = graphicsLayer->platformLayer(); |
+ buildRegionObjects(webLayer->nonFastScrollableRegion(), *scrollRects, TypeBuilder::LayerTree::ScrollRect::Type::RepaintsOnScroll, idForLayer(graphicsLayer)); |
+ buildRegionObjects(webLayer->touchEventHandlerRegion(), *scrollRects, TypeBuilder::LayerTree::ScrollRect::Type::TouchEventHandler, idForLayer(graphicsLayer)); |
+ if (webLayer->haveWheelEventHandlers()) { |
+ RefPtr<TypeBuilder::DOM::Rect> rectObject = TypeBuilder::DOM::Rect::create() |
+ .setX(webLayer->position().x) |
+ .setY(webLayer->position().y) |
+ .setHeight(webLayer->bounds().height) |
+ .setWidth(webLayer->bounds().width); |
+ RefPtr<TypeBuilder::LayerTree::ScrollRect> regionObject = TypeBuilder::LayerTree::ScrollRect::create() |
+ .setRect(rectObject) |
+ .setType(TypeBuilder::LayerTree::ScrollRect::Type::WheelEventHandler); |
+ scrollRects->addItem(regionObject); |
+ } |
+ return scrollRects->length() ? scrollRects : nullptr; |
+} |
+ |
static PassRefPtr<TypeBuilder::LayerTree::Layer> buildObjectForLayer(GraphicsLayer* graphicsLayer, int nodeId) |
{ |
blink::WebLayer* webLayer = graphicsLayer->platformLayer(); |
@@ -107,6 +145,10 @@ static PassRefPtr<TypeBuilder::LayerTree::Layer> buildObjectForLayer(GraphicsLay |
layerObject->setAnchorY(anchor.y()); |
layerObject->setAnchorZ(anchor.z()); |
} |
+ RefPtr<TypeBuilder::Array<TypeBuilder::LayerTree::ScrollRect> > scrollRects = |
+ buildScrollRectsForLayer(graphicsLayer); |
+ if (scrollRects) |
+ layerObject->setScrollRects(buildScrollRectsForLayer(graphicsLayer)); |
return layerObject; |
} |
@@ -154,7 +196,11 @@ void InspectorLayerTreeAgent::disable(ErrorString*) |
void InspectorLayerTreeAgent::layerTreeDidChange() |
{ |
- m_frontend->layerTreeDidChange(buildLayerTree()); |
+ RefPtr<TypeBuilder::Array<TypeBuilder::LayerTree::Layer> > layers = TypeBuilder::Array<TypeBuilder::LayerTree::Layer>::create(); |
+ if (buildLayerTree(*layers)) |
+ m_frontend->layerTreeDidChange(layers); |
+ else |
+ m_frontend->layerTreeDidChange(nullptr); |
} |
void InspectorLayerTreeAgent::didPaint(RenderObject*, const GraphicsLayer* graphicsLayer, GraphicsContext*, const LayoutRect& rect) |
@@ -171,16 +217,15 @@ void InspectorLayerTreeAgent::didPaint(RenderObject*, const GraphicsLayer* graph |
m_frontend->layerPainted(idForLayer(graphicsLayer), domRect.release()); |
} |
-PassRefPtr<TypeBuilder::Array<TypeBuilder::LayerTree::Layer> > InspectorLayerTreeAgent::buildLayerTree() |
+bool InspectorLayerTreeAgent::buildLayerTree(TypeBuilder::Array<TypeBuilder::LayerTree::Layer>& layers) |
{ |
RenderLayerCompositor* compositor = renderLayerCompositor(); |
if (!compositor || !compositor->inCompositingMode()) |
- return nullptr; |
+ return false; |
LayerIdToNodeIdMap layerIdToNodeIdMap; |
- RefPtr<TypeBuilder::Array<TypeBuilder::LayerTree::Layer> > layers = TypeBuilder::Array<TypeBuilder::LayerTree::Layer>::create(); |
buildLayerIdToNodeIdMap(compositor->rootRenderLayer(), layerIdToNodeIdMap); |
gatherGraphicsLayers(compositor->rootGraphicsLayer(), layerIdToNodeIdMap, layers); |
- return layers.release(); |
+ return true; |
} |
void InspectorLayerTreeAgent::buildLayerIdToNodeIdMap(RenderLayer* root, LayerIdToNodeIdMap& layerIdToNodeIdMap) |
@@ -202,12 +247,13 @@ void InspectorLayerTreeAgent::buildLayerIdToNodeIdMap(RenderLayer* root, LayerId |
} |
} |
-void InspectorLayerTreeAgent::gatherGraphicsLayers(GraphicsLayer* root, HashMap<int, int>& layerIdToNodeIdMap, RefPtr<TypeBuilder::Array<TypeBuilder::LayerTree::Layer> >& layers) |
+void InspectorLayerTreeAgent::gatherGraphicsLayers(GraphicsLayer* root, HashMap<int, int>& layerIdToNodeIdMap, |
+ TypeBuilder::Array<TypeBuilder::LayerTree::Layer>& layers) |
{ |
int layerId = root->platformLayer()->id(); |
if (m_pageOverlayLayerIds.find(layerId) != WTF::kNotFound) |
return; |
- layers->addItem(buildObjectForLayer(root, layerIdToNodeIdMap.get(layerId))); |
+ layers.addItem(buildObjectForLayer(root, layerIdToNodeIdMap.get(layerId))); |
if (GraphicsLayer* replica = root->replicaLayer()) |
gatherGraphicsLayers(replica, layerIdToNodeIdMap, layers); |
for (size_t i = 0, size = root->children().size(); i < size; ++i) |