summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/inspector/inspector_highlight.cc
diff options
context:
space:
mode:
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.cc129
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;
}