findFailingNodes(snapshot) {
    /** @type {NodeFontData[]} */
    const failingNodes = [];
    let totalTextLength = 0;
    let failingTextLength = 0;

    for (const textNodeData of this.getTextNodesInLayoutFromSnapshot(snapshot)) {
      if (textNodeData.visibility === 'hidden') {
        continue;
      }

      totalTextLength += textNodeData.textLength;

      if (textNodeData.fontSize >= MINIMAL_LEGIBLE_FONT_SIZE_PX) {
        continue;
      }

      // Once a bad TextNode is identified, its parent Node is needed.
      failingTextLength += textNodeData.textLength;
      failingNodes.push({
        nodeId: 0, // Set later in fetchFailingNodeSourceRules.
        parentNode: textNodeData.parentNode,
        textLength: textNodeData.textLength,
        fontSize: textNodeData.fontSize,
      });
    }

    return {totalTextLength, failingTextLength, failingNodes};
  }
Get all the failing text nodes that don't meet the legible text threshold.
@param {LH.Crdp.DOMSnapshot.CaptureSnapshotResponse} snapshot