fix(web-surface): bound live input paints

This commit is contained in:
2026-05-16 01:02:38 -04:00
parent 8841d74ac5
commit 234bf4c8a5
2 changed files with 75 additions and 69 deletions
@@ -125,8 +125,8 @@ fn assert_web_surface_scrolls_prd_site() -> Result<(), Box<dyn Error>> {
let profile_id = ProfileId::new();
let case = PRD_TOP_SITE_CASES
.iter()
.find(|case| case.url == "https://servo.org/")
.ok_or("missing servo.org live-site case")?;
.find(|case| case.url == "https://github.com")
.ok_or("missing github.com live-site case")?;
let tab = web_tab(profile_id, case.url)?;
assert_eq!(
@@ -299,19 +299,14 @@ fn wait_for_ready_frame(
let mut last_error = None;
loop {
if started_at.elapsed() >= LIVE_SITE_WAIT_TIMEOUT {
return Err(last_error.unwrap_or_else(|| format!("timed out rendering {}", case.url)));
}
store.tick(std::slice::from_ref(tab_id));
match store.state(tab_id) {
Some(WebSurfaceState::Ready(frame)) => {
if let Err(error) = validate_prd_frame(frame, case, 0) {
last_error = Some(error);
thread::sleep(LIVE_SITE_WAIT_INTERVAL);
continue;
} else {
return Ok(frame.clone());
}
return Ok(frame.clone());
}
Some(WebSurfaceState::Failed { message, .. }) => {
return Err(format!("{} failed: {message}", case.url));
@@ -319,6 +314,10 @@ fn wait_for_ready_frame(
Some(WebSurfaceState::Loading { .. }) | None => {}
}
if started_at.elapsed() >= LIVE_SITE_WAIT_TIMEOUT {
return Err(last_error.unwrap_or_else(|| format!("timed out rendering {}", case.url)));
}
thread::sleep(LIVE_SITE_WAIT_INTERVAL);
}
}
@@ -334,12 +333,6 @@ fn wait_for_ready_frame_at_scroll(
let mut last_error = None;
loop {
if started_at.elapsed() >= LIVE_SITE_WAIT_TIMEOUT {
return Err(last_error.unwrap_or_else(|| {
format!("timed out rendering {} at scroll y={expected_scroll_y}", case.url)
}));
}
store.tick(std::slice::from_ref(tab_id));
match store.state(tab_id) {
Some(WebSurfaceState::Ready(frame))
@@ -347,10 +340,7 @@ fn wait_for_ready_frame_at_scroll(
{
if let Err(error) = validate_prd_frame(frame, case, expected_scroll_y) {
last_error = Some(error);
thread::sleep(LIVE_SITE_WAIT_INTERVAL);
continue;
}
if !frame.has_hardware_surface()
} else if !frame.has_hardware_surface()
&& let Some(previous_sample_hash) = previous_sample_hash
&& frame.sample_hash() == previous_sample_hash
{
@@ -358,18 +348,29 @@ fn wait_for_ready_frame_at_scroll(
"{} scroll y={expected_scroll_y} sample hash unchanged",
case.url
));
thread::sleep(LIVE_SITE_WAIT_INTERVAL);
continue;
} else {
return Ok(frame.clone());
}
return Ok(frame.clone());
}
Some(WebSurfaceState::Ready(_)) => {}
Some(WebSurfaceState::Ready(frame)) => {
last_error = Some(format!(
"{} expected scroll y={expected_scroll_y}, observed {}",
case.url,
frame.detail_label()
));
}
Some(WebSurfaceState::Failed { message, .. }) => {
return Err(format!("{} failed: {message}", case.url));
}
Some(WebSurfaceState::Loading { .. }) | None => {}
}
if started_at.elapsed() >= LIVE_SITE_WAIT_TIMEOUT {
return Err(last_error.unwrap_or_else(|| {
format!("timed out rendering {} at scroll y={expected_scroll_y}", case.url)
}));
}
thread::sleep(LIVE_SITE_WAIT_INTERVAL);
}
}
@@ -385,12 +386,6 @@ fn wait_for_ready_frame_at_size(
let mut last_error = None;
loop {
if started_at.elapsed() >= LIVE_SITE_WAIT_TIMEOUT {
return Err(last_error.unwrap_or_else(|| {
format!("timed out rendering {} at {expected_width}x{expected_height}", case.url)
}));
}
store.tick(std::slice::from_ref(tab_id));
match store.state(tab_id) {
Some(WebSurfaceState::Ready(frame))
@@ -401,10 +396,9 @@ fn wait_for_ready_frame_at_size(
validate_prd_frame_at_size(frame, case, expected_width, expected_height)
{
last_error = Some(error);
thread::sleep(LIVE_SITE_WAIT_INTERVAL);
continue;
} else {
return Ok(frame.clone());
}
return Ok(frame.clone());
}
Some(WebSurfaceState::Ready(_)) => {}
Some(WebSurfaceState::Failed { message, .. }) => {
@@ -413,6 +407,12 @@ fn wait_for_ready_frame_at_size(
Some(WebSurfaceState::Loading { .. }) | None => {}
}
if started_at.elapsed() >= LIVE_SITE_WAIT_TIMEOUT {
return Err(last_error.unwrap_or_else(|| {
format!("timed out rendering {} at {expected_width}x{expected_height}", case.url)
}));
}
thread::sleep(LIVE_SITE_WAIT_INTERVAL);
}
}
@@ -427,6 +427,25 @@ fn wait_for_ready_frame_at_css_size(
let mut last_error = None;
loop {
store.tick(std::slice::from_ref(tab_id));
match store.state(tab_id) {
Some(WebSurfaceState::Ready(frame))
if frame.size().width == expected.physical_width
&& frame.size().height == expected.physical_height =>
{
if let Err(error) = validate_prd_frame_at_css_size(frame, case, expected) {
last_error = Some(error);
} else {
return Ok(frame.clone());
}
}
Some(WebSurfaceState::Ready(_)) => {}
Some(WebSurfaceState::Failed { message, .. }) => {
return Err(format!("{} failed: {message}", case.url));
}
Some(WebSurfaceState::Loading { .. }) | None => {}
}
if started_at.elapsed() >= LIVE_SITE_WAIT_TIMEOUT {
return Err(last_error.unwrap_or_else(|| {
format!(
@@ -440,26 +459,6 @@ fn wait_for_ready_frame_at_css_size(
}));
}
store.tick(std::slice::from_ref(tab_id));
match store.state(tab_id) {
Some(WebSurfaceState::Ready(frame))
if frame.size().width == expected.physical_width
&& frame.size().height == expected.physical_height =>
{
if let Err(error) = validate_prd_frame_at_css_size(frame, case, expected) {
last_error = Some(error);
thread::sleep(LIVE_SITE_WAIT_INTERVAL);
continue;
}
return Ok(frame.clone());
}
Some(WebSurfaceState::Ready(_)) => {}
Some(WebSurfaceState::Failed { message, .. }) => {
return Err(format!("{} failed: {message}", case.url));
}
Some(WebSurfaceState::Loading { .. }) | None => {}
}
thread::sleep(LIVE_SITE_WAIT_INTERVAL);
}
}