diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/core/inspector/inspector_highlight.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/core/inspector/inspector_highlight.cc | 129 |
1 files changed, 96 insertions, 33 deletions
diff --git a/chromium/third_party/blink/renderer/core/inspector/inspector_highlight.cc b/chromium/third_party/blink/renderer/core/inspector/inspector_highlight.cc index 4d319c9667b..71a3169d516 100644 --- a/chromium/third_party/blink/renderer/core/inspector/inspector_highlight.cc +++ b/chromium/third_party/blink/renderer/core/inspector/inspector_highlight.cc @@ -117,8 +117,8 @@ class ShapePathBuilder : public PathBuilder { FloatPoint TranslatePoint(const FloatPoint& point) override { FloatPoint layout_object_point = shape_outside_info_.ShapeToLayoutObjectPoint(point); - return view_->ContentsToViewport( - RoundedIntPoint(layout_object_.LocalToAbsolute(layout_object_point))); + return FloatPoint(view_->FrameToViewport( + RoundedIntPoint(layout_object_.LocalToAbsolute(layout_object_point)))); } private: @@ -152,21 +152,18 @@ Path QuadToPath(const FloatQuad& quad) { return quad_path; } -FloatPoint ContentsPointToViewport(const LocalFrameView* view, - FloatPoint point_in_contents) { - LayoutPoint point_in_frame = - view->ContentsToFrame(LayoutPoint(point_in_contents)); - FloatPoint point_in_root_frame = - FloatPoint(view->ConvertToRootFrame(point_in_frame)); - return FloatPoint(view->GetPage()->GetVisualViewport().RootFrameToViewport( - point_in_root_frame)); +FloatPoint FramePointToViewport(const LocalFrameView* view, + FloatPoint point_in_frame) { + FloatPoint point_in_root_frame = view->ConvertToRootFrame(point_in_frame); + return view->GetPage()->GetVisualViewport().RootFrameToViewport( + point_in_root_frame); } -void ContentsQuadToViewport(const LocalFrameView* view, FloatQuad& quad) { - quad.SetP1(ContentsPointToViewport(view, quad.P1())); - quad.SetP2(ContentsPointToViewport(view, quad.P2())); - quad.SetP3(ContentsPointToViewport(view, quad.P3())); - quad.SetP4(ContentsPointToViewport(view, quad.P4())); +void FrameQuadToViewport(const LocalFrameView* view, FloatQuad& quad) { + quad.SetP1(FramePointToViewport(view, quad.P1())); + quad.SetP2(FramePointToViewport(view, quad.P2())); + quad.SetP3(FramePointToViewport(view, quad.P3())); + quad.SetP4(FramePointToViewport(view, quad.P4())); } const ShapeOutsideInfo* ShapeOutsideInfoForNode(Node* node, @@ -187,7 +184,7 @@ const ShapeOutsideInfo* ShapeOutsideInfoForNode(Node* node, LayoutRect shape_bounds = shape_outside_info->ComputedShapePhysicalBoundingBox(); *bounds = layout_box->LocalToAbsoluteQuad(FloatRect(shape_bounds)); - ContentsQuadToViewport(containing_view, *bounds); + FrameQuadToViewport(containing_view, *bounds); return shape_outside_info; } @@ -287,6 +284,36 @@ std::unique_ptr<protocol::DictionaryValue> BuildGridInfo( return grid_info; } +void CollectQuadsRecursive(Node* node, Vector<FloatQuad>& out_quads) { + LayoutObject* layout_object = node->GetLayoutObject(); + if (!layout_object) + return; + + // For inline elements, absoluteQuads will return a line box based on the + // line-height and font metrics, which is technically incorrect as replaced + // elements like images should use their intristic height and expand the + // linebox as needed. To get an appropriate quads we descend + // into the children and have them add their boxes. + if (layout_object->IsLayoutInline()) { + for (Node* child = LayoutTreeBuilderTraversal::FirstChild(*node); child; + child = LayoutTreeBuilderTraversal::NextSibling(*child)) + CollectQuadsRecursive(child, out_quads); + } else { + layout_object->AbsoluteQuads(out_quads); + } +} + +void CollectQuads(Node* node, Vector<FloatQuad>& out_quads) { + CollectQuadsRecursive(node, out_quads); + LocalFrameView* containing_view = + node->GetLayoutObject() ? node->GetLayoutObject()->GetFrameView() + : nullptr; + if (containing_view) { + for (FloatQuad& quad : out_quads) + FrameQuadToViewport(containing_view, quad); + } +} + } // namespace InspectorHighlight::InspectorHighlight(float scale) @@ -391,17 +418,10 @@ void InspectorHighlight::AppendNodeHighlight( if (!layout_object) return; - // LayoutSVGRoot should be highlighted through the isBox() code path, all - // other SVG elements should just dump their absoluteQuads(). - if (layout_object->GetNode() && layout_object->GetNode()->IsSVGElement() && - !layout_object->IsSVGRoot()) { - Vector<FloatQuad> quads; - layout_object->AbsoluteQuads(quads); - LocalFrameView* containing_view = layout_object->GetFrameView(); - for (size_t i = 0; i < quads.size(); ++i) { - if (containing_view) - ContentsQuadToViewport(containing_view, quads[i]); - AppendQuad(quads[i], highlight_config.content, + Vector<FloatQuad> svg_quads; + if (BuildSVGQuads(node, svg_quads)) { + for (size_t i = 0; i < svg_quads.size(); ++i) { + AppendQuad(svg_quads[i], highlight_config.content, highlight_config.content_outline); } return; @@ -460,8 +480,17 @@ bool InspectorHighlight::GetBoxModel( return false; FloatQuad content, padding, border, margin; - if (!BuildNodeQuads(node, &content, &padding, &border, &margin)) + Vector<FloatQuad> svg_quads; + if (BuildSVGQuads(node, svg_quads)) { + if (!svg_quads.size()) + return false; + content = svg_quads[0]; + padding = svg_quads[0]; + border = svg_quads[0]; + margin = svg_quads[0]; + } else if (!BuildNodeQuads(node, &content, &padding, &border, &margin)) { return false; + } AdjustForAbsoluteZoom::AdjustFloatQuad(content, *layout_object); AdjustForAbsoluteZoom::AdjustFloatQuad(padding, *layout_object); @@ -475,7 +504,7 @@ bool InspectorHighlight::GetBoxModel( margin.Scale(scale, scale); IntRect bounding_box = - view->ContentsToRootFrame(layout_object->AbsoluteBoundingBoxRect()); + view->ConvertToRootFrame(layout_object->AbsoluteBoundingBoxRect()); LayoutBoxModelObject* model_object = layout_object->IsBoxModelObject() ? ToLayoutBoxModelObject(layout_object) : nullptr; @@ -524,6 +553,40 @@ bool InspectorHighlight::GetBoxModel( return true; } +// static +bool InspectorHighlight::BuildSVGQuads(Node* node, Vector<FloatQuad>& quads) { + LayoutObject* layout_object = node->GetLayoutObject(); + if (!layout_object) + return false; + if (!layout_object->GetNode() || !layout_object->GetNode()->IsSVGElement() || + layout_object->IsSVGRoot()) + return false; + CollectQuads(node, quads); + return true; +} + +// static +bool InspectorHighlight::GetContentQuads( + Node* node, + std::unique_ptr<protocol::Array<protocol::Array<double>>>* result) { + LayoutObject* layout_object = node->GetLayoutObject(); + LocalFrameView* view = node->GetDocument().View(); + if (!layout_object || !view) + return false; + Vector<FloatQuad> quads; + CollectQuads(node, quads); + float scale = 1 / view->GetPage()->GetVisualViewport().Scale(); + for (FloatQuad& quad : quads) { + AdjustForAbsoluteZoom::AdjustFloatQuad(quad, *layout_object); + quad.Scale(scale, scale); + } + + result->reset(new protocol::Array<protocol::Array<double>>()); + for (FloatQuad& quad : quads) + (*result)->addItem(BuildArrayForQuad(quad)); + return true; +} + bool InspectorHighlight::BuildNodeQuads(Node* node, FloatQuad* content, FloatQuad* padding, @@ -597,10 +660,10 @@ bool InspectorHighlight::BuildNodeQuads(Node* node, *border = layout_object->LocalToAbsoluteQuad(FloatRect(border_box)); *margin = layout_object->LocalToAbsoluteQuad(FloatRect(margin_box)); - ContentsQuadToViewport(containing_view, *content); - ContentsQuadToViewport(containing_view, *padding); - ContentsQuadToViewport(containing_view, *border); - ContentsQuadToViewport(containing_view, *margin); + FrameQuadToViewport(containing_view, *content); + FrameQuadToViewport(containing_view, *padding); + FrameQuadToViewport(containing_view, *border); + FrameQuadToViewport(containing_view, *margin); return true; } |