From 31a892866dbf9a9e428477440d318feb398ea867 Mon Sep 17 00:00:00 2001 From: xxrl <837951112@qq.com> Date: Thu, 14 Dec 2023 09:45:21 +0800 Subject: [PATCH] fix: devtool select img element --- webf/lib/src/devtools/modules/dom.dart | 16 ++++++++++++++-- webf/lib/src/svg/svg.dart | 1 - webf/lib/src/svg/svg_render_object_builder.dart | 5 ++++- webf/lib/svg.dart | 2 ++ 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/webf/lib/src/devtools/modules/dom.dart b/webf/lib/src/devtools/modules/dom.dart index 15806ca0fd..3541d538d4 100644 --- a/webf/lib/src/devtools/modules/dom.dart +++ b/webf/lib/src/devtools/modules/dom.dart @@ -10,6 +10,7 @@ import 'package:webf/dom.dart'; import 'package:webf/rendering.dart'; import 'package:flutter/rendering.dart'; import 'package:webf/launcher.dart'; +import 'package:webf/svg.dart'; const int DOCUMENT_NODE_ID = 0; const String DEFAULT_FRAME_ID = 'main_frame'; @@ -47,8 +48,19 @@ class InspectDOMModule extends UIInspectorModule { RenderBox rootRenderObject = document.renderer!; BoxHitTestResult result = BoxHitTestResult(); rootRenderObject.hitTest(result, position: Offset(x.toDouble(), y.toDouble())); - if (result.path.first.target is RenderBoxModel) { - RenderBoxModel lastHitRenderBoxModel = result.path.first.target as RenderBoxModel; + var hitPath = result.path; + if (hitPath.isEmpty) { + sendToFrontend(id, null); + return; + } + // find real img element. + if (hitPath.first.target is WebFRenderImage || + (hitPath.first.target is RenderSVGRoot && + (hitPath.first.target as RenderBoxModel).renderStyle.target.pointer == null)) { + hitPath = hitPath.skip(1); + } + if (hitPath.isNotEmpty && hitPath.first.target is RenderBoxModel) { + RenderBoxModel lastHitRenderBoxModel = hitPath.first.target as RenderBoxModel; int? targetId = lastHitRenderBoxModel.renderStyle.target.pointer!.address; sendToFrontend( id, diff --git a/webf/lib/src/svg/svg.dart b/webf/lib/src/svg/svg.dart index 56e3535d02..06026e75a2 100644 --- a/webf/lib/src/svg/svg.dart +++ b/webf/lib/src/svg/svg.dart @@ -9,7 +9,6 @@ import 'package:webf/dom.dart'; import 'package:webf/foundation.dart'; import 'package:webf/svg.dart'; import 'core/aspect_ratio.dart'; -import 'rendering/root.dart'; const DEFAULT_VIEW_BOX_TOP = 0.0; const DEFAULT_VIEW_BOX_LEFT = 0.0; diff --git a/webf/lib/src/svg/svg_render_object_builder.dart b/webf/lib/src/svg/svg_render_object_builder.dart index ed0dd41457..72bef61e0f 100644 --- a/webf/lib/src/svg/svg_render_object_builder.dart +++ b/webf/lib/src/svg/svg_render_object_builder.dart @@ -8,7 +8,6 @@ import 'package:webf/dom.dart'; import 'package:webf/painting.dart'; import 'package:webf/rendering.dart'; import 'package:webf/src/svg/rendering/container.dart'; -import 'package:webf/src/svg/rendering/root.dart'; import 'package:webf/svg.dart'; // Those size is get from chrome. I cannot found any specs for that. @XGHeaven @@ -109,10 +108,14 @@ class SVGRenderBoxBuilder { element.renderStyle.height = CSSLengthValue.auto; element.renderStyle.width = CSSLengthValue.auto; } + element.tagName = tagName; + element.namespaceURI = SVG_ELEMENT_URI; return element.renderBoxModel!; } print('Unknown SVG element $tagName'); final element = SVGUnknownElement(null); + element.tagName = tagName; + element.namespaceURI = SVG_ELEMENT_URI; return element.renderBoxModel!; } diff --git a/webf/lib/svg.dart b/webf/lib/svg.dart index f8d53c4606..0ba976e587 100644 --- a/webf/lib/svg.dart +++ b/webf/lib/svg.dart @@ -20,3 +20,5 @@ export 'src/svg/style.dart'; export 'src/svg/line.dart'; export 'src/svg/constants.dart'; export 'src/svg/svg_render_object_builder.dart'; +export 'src/svg/rendering/root.dart'; +