Index: Source/core/inspector/InspectorLayerTreeAgent.cpp |
diff --git a/Source/core/inspector/InspectorLayerTreeAgent.cpp b/Source/core/inspector/InspectorLayerTreeAgent.cpp |
index 6112511c155c9c391cb45ff38b25dfc29146aa53..a644fe33d7a0b090a76043b721cd66859b43c19b 100644 |
--- a/Source/core/inspector/InspectorLayerTreeAgent.cpp |
+++ b/Source/core/inspector/InspectorLayerTreeAgent.cpp |
@@ -110,14 +110,58 @@ static PassRefPtr<TypeBuilder::LayerTree::Layer> buildObjectForLayer(GraphicsLay |
return layerObject; |
} |
-void gatherGraphicsLayers(GraphicsLayer* root, HashMap<int, int>& layerIdToNodeIdMap, RefPtr<TypeBuilder::Array<TypeBuilder::LayerTree::Layer> >& layers) |
+static void addRegionObjects(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::LayerTree::ScrollRect> regionObject = TypeBuilder::LayerTree::ScrollRect::create() |
+ .setLayerId(layerId) |
+ .setX(regions[i].x) |
+ .setY(regions[i].y) |
+ .setHeight(regions[i].height) |
+ .setWidth(regions[i].width) |
+ .setType(type); |
+ scrollRects.addItem(regionObject); |
+ } |
+} |
+ |
+ |
+static void addScrollRectsForLayer(GraphicsLayer* graphicsLayer, |
+ TypeBuilder::Array<TypeBuilder::LayerTree::ScrollRect>& scrollRects) |
+{ |
+ blink::WebLayer* webLayer = graphicsLayer->platformLayer(); |
+ addRegionObjects(webLayer->nonFastScrollableRegion(), |
+ scrollRects, |
+ TypeBuilder::LayerTree::ScrollRect::Type::RepaintsOnScroll, |
+ idForLayer(graphicsLayer)); |
+ addRegionObjects(webLayer->touchEventHandlerRegion(), |
+ scrollRects, |
+ TypeBuilder::LayerTree::ScrollRect::Type::TouchEventHandler, |
+ idForLayer(graphicsLayer)); |
+ if (webLayer->haveWheelEventHandlers()) { |
+ RefPtr<TypeBuilder::LayerTree::ScrollRect> regionObject = TypeBuilder::LayerTree::ScrollRect::create() |
+ .setLayerId(idForLayer(graphicsLayer)) |
+ .setX(webLayer->position().x) |
+ .setY(webLayer->position().y) |
+ .setHeight(webLayer->bounds().height) |
+ .setWidth(webLayer->bounds().width) |
+ .setType(TypeBuilder::LayerTree::ScrollRect::Type::WheelEventHandler); |
+ scrollRects.addItem(regionObject); |
+ } |
+} |
+ |
+void gatherGraphicsLayers(GraphicsLayer* root, HashMap<int, int>& layerIdToNodeIdMap, |
+ TypeBuilder::Array<TypeBuilder::LayerTree::Layer>& layers, TypeBuilder::Array<TypeBuilder::LayerTree::ScrollRect>& scrollRects) |
{ |
int layerId = root->platformLayer()->id(); |
- layers->addItem(buildObjectForLayer(root, layerIdToNodeIdMap.get(layerId))); |
+ layers.addItem(buildObjectForLayer(root, layerIdToNodeIdMap.get(layerId))); |
+ addScrollRectsForLayer(root, scrollRects); |
if (GraphicsLayer* replica = root->replicaLayer()) |
- gatherGraphicsLayers(replica, layerIdToNodeIdMap, layers); |
+ gatherGraphicsLayers(replica, layerIdToNodeIdMap, layers, scrollRects); |
for (size_t i = 0, size = root->children().size(); i < size; ++i) |
- gatherGraphicsLayers(root->children()[i], layerIdToNodeIdMap, layers); |
+ gatherGraphicsLayers(root->children()[i], layerIdToNodeIdMap, layers, scrollRects); |
} |
InspectorLayerTreeAgent::InspectorLayerTreeAgent(InspectorDOMAgent* domAgent, Page* page) |
@@ -164,7 +208,12 @@ void InspectorLayerTreeAgent::disable(ErrorString*) |
void InspectorLayerTreeAgent::layerTreeDidChange() |
{ |
- m_frontend->layerTreeDidChange(buildLayerTree()); |
+ RefPtr<TypeBuilder::Array<TypeBuilder::LayerTree::Layer> > layers = TypeBuilder::Array<TypeBuilder::LayerTree::Layer>::create(); |
+ RefPtr<TypeBuilder::Array<TypeBuilder::LayerTree::ScrollRect> > scrollRects = TypeBuilder::Array<TypeBuilder::LayerTree::ScrollRect>::create(); |
+ if (buildLayerTree(*layers, *scrollRects)) |
+ m_frontend->layerTreeDidChange(layers, scrollRects); |
+ else |
+ m_frontend->layerTreeDidChange(nullptr, nullptr); |
} |
void InspectorLayerTreeAgent::didPaint(RenderObject*, const GraphicsLayer* graphicsLayer, GraphicsContext*, const LayoutRect& rect) |
@@ -181,16 +230,16 @@ 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, |
+ TypeBuilder::Array<TypeBuilder::LayerTree::ScrollRect>& scrollRects) |
{ |
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(); |
+ gatherGraphicsLayers(compositor->rootGraphicsLayer(), layerIdToNodeIdMap, layers, scrollRects); |
+ return true; |
} |
void InspectorLayerTreeAgent::buildLayerIdToNodeIdMap(RenderLayer* root, LayerIdToNodeIdMap& layerIdToNodeIdMap) |