use std::collections::HashMap;
use tracing::{debug, warn};
use crate::page::locator::AriaSnapshot;
pub(crate) fn stitch_frame_content(
snapshot: &mut AriaSnapshot,
frame_snapshots: &HashMap<String, AriaSnapshot>,
depth: usize,
) {
const MAX_DEPTH: usize = 10;
if depth > MAX_DEPTH {
warn!(
depth = depth,
"Max frame nesting depth exceeded, stopping recursion"
);
return;
}
if snapshot.is_frame == Some(true) {
let frame_snapshot = snapshot
.frame_url
.as_ref()
.and_then(|url| frame_snapshots.get(url))
.or_else(|| {
snapshot
.frame_name
.as_ref()
.and_then(|name| frame_snapshots.get(name))
});
if let Some(frame_content) = frame_snapshot {
debug!(
frame_url = ?snapshot.frame_url,
frame_name = ?snapshot.frame_name,
depth = depth,
"Stitching frame content into snapshot"
);
snapshot.is_frame = Some(false);
snapshot.children = vec![frame_content.clone()];
} else {
debug!(
frame_url = ?snapshot.frame_url,
frame_name = ?snapshot.frame_name,
"No matching frame snapshot found for iframe boundary"
);
}
}
for child in &mut snapshot.children {
stitch_frame_content(child, frame_snapshots, depth + 1);
}
}