onGetNodeForLocation method

void onGetNodeForLocation(
  1. int? id,
  2. Map<String, dynamic> params
)

Implementation

void onGetNodeForLocation(int? id, Map<String, dynamic> params) {
  if (DebugFlags.enableDevToolsLogs) {
    devToolsLogger.finer('[DevTools] DOM.getNodeForLocation x=${params['x']} y=${params['y']}');
  }
  int x = params['x'];
  int y = params['y'];

  // Check if controller is attached to Flutter
  final ctx = dbgContext;
  if (ctx != null && !ctx.isFlutterAttached) {
    // Return null if controller is not attached
    sendToFrontend(id, null);
    return;
  }

  if (document == null) {
    sendToFrontend(id, null);
    return;
  }
  RenderBox rootRenderObject = document!.viewport!;
  BoxHitTestResult result = BoxHitTestResult();
  rootRenderObject.hitTest(result,
      position: Offset(x.toDouble(), y.toDouble()));
  var hitPath = result.path;
  if (hitPath.isEmpty) {
    sendToFrontend(id, null);
    return;
  }
  // find real img element.
  if (hitPath.first.target is WebFRenderImage ||
      ((hitPath.first.target as RenderBoxModel)
                  .renderStyle
                  .target
                  .pointer ==
              null)) {
    hitPath = hitPath.skip(1);
  }
  if (hitPath.isNotEmpty && hitPath.first.target is RenderBoxModel) {
    RenderObject lastHitRenderBoxModel =
        result.path.first.target as RenderObject;
    if (lastHitRenderBoxModel is RenderBoxModel && dbgContext != null) {
      int targetId = dbgContext!
          .forDevtoolsNodeId(lastHitRenderBoxModel.renderStyle.target);
      sendToFrontend(
          id,
          JSONEncodableMap({
            'backendId': targetId,
            'frameId': DEFAULT_FRAME_ID,
            'nodeId': targetId,
          }));
    } else {
      sendToFrontend(id, null);
    }
  } else {
    sendToFrontend(id, null);
  }
}