(row)
| 400 | } |
| 401 | |
| 402 | function getRowTimestamp(row) { |
| 403 | const timeCell = row.querySelector('td.xW span, td.xW time, td.xW [title]'); |
| 404 | const candidates = [ |
| 405 | timeCell?.getAttribute?.('title'), |
| 406 | timeCell?.getAttribute?.('aria-label'), |
| 407 | timeCell?.textContent, |
| 408 | ].filter(Boolean); |
| 409 | |
| 410 | for (const candidate of candidates) { |
| 411 | const parsed = parseGmailTimestampText(candidate); |
| 412 | if (parsed) return parsed; |
| 413 | } |
| 414 | |
| 415 | return null; |
| 416 | } |
| 417 | |
| 418 | function getRowFingerprint(row, index = 0) { |
| 419 | const marker = row.querySelector('[data-thread-id], [data-legacy-thread-id], [data-legacy-last-message-id]'); |
no test coverage detected