update
This commit is contained in:
@@ -4,14 +4,14 @@ use gpui::RenderImage;
|
||||
use image::{ImageBuffer, Rgba};
|
||||
use thiserror::Error;
|
||||
|
||||
use crate::services::servo_sidecar::SidecarSnapshot;
|
||||
use crate::services::servo_live::ServoLiveFrame;
|
||||
|
||||
use super::{
|
||||
web_surface_geometry::{WebSurfaceClickPoint, WebSurfaceScrollOffset, WebSurfaceSize},
|
||||
web_surface_image::renderable_image_buffer,
|
||||
};
|
||||
#[cfg(all(test, feature = "live-site-smoke"))]
|
||||
use super::web_surface_geometry::WebSurfaceSize;
|
||||
use super::web_surface_geometry::{WebSurfaceClickPoint, WebSurfaceScrollOffset};
|
||||
|
||||
#[derive(Clone)]
|
||||
#[cfg_attr(not(all(test, feature = "live-site-smoke")), allow(dead_code))]
|
||||
pub(super) struct WebSurfaceFrame {
|
||||
pub(super) requested_url: String,
|
||||
loaded_url: Option<String>,
|
||||
@@ -33,62 +33,75 @@ pub(super) struct WebSurfaceFrame {
|
||||
}
|
||||
|
||||
impl WebSurfaceFrame {
|
||||
pub(super) fn from_snapshot(
|
||||
pub(super) fn from_live_frame(
|
||||
requested_url: String,
|
||||
scroll_offset: WebSurfaceScrollOffset,
|
||||
zoom_percent: u16,
|
||||
click_point: Option<WebSurfaceClickPoint>,
|
||||
typed_text: Option<String>,
|
||||
snapshot: SidecarSnapshot,
|
||||
frame: ServoLiveFrame,
|
||||
) -> Result<Self, WebSurfaceError> {
|
||||
let width = snapshot.width();
|
||||
let height = snapshot.height();
|
||||
let loaded_url = snapshot.loaded_url().map(str::to_string);
|
||||
let title = snapshot.title().map(str::to_string);
|
||||
let render_state = snapshot.render_state().to_string();
|
||||
#[cfg(all(test, feature = "live-site-smoke"))]
|
||||
let non_white_pixel_count = snapshot.non_white_pixel_count();
|
||||
#[cfg(all(test, feature = "live-site-smoke"))]
|
||||
let content_pixel_count = snapshot.content_pixel_count();
|
||||
#[cfg(all(test, feature = "live-site-smoke"))]
|
||||
let sample_hash = snapshot.sample_hash();
|
||||
let rgba_bytes = snapshot.into_rgba_bytes();
|
||||
|
||||
let Some(buffer) = ImageBuffer::<Rgba<u8>, _>::from_raw(width, height, rgba_bytes) else {
|
||||
return Err(WebSurfaceError::InvalidFrameBuffer { width, height });
|
||||
};
|
||||
|
||||
let image_buffer = renderable_image_buffer(buffer);
|
||||
|
||||
Ok(Self {
|
||||
Self::from_parts(WebSurfaceFrameParts {
|
||||
requested_url,
|
||||
loaded_url,
|
||||
title,
|
||||
render_state,
|
||||
width,
|
||||
height,
|
||||
loaded_url: frame.loaded_url().map(str::to_string),
|
||||
title: frame.title().map(str::to_string),
|
||||
render_state: frame.render_state().to_string(),
|
||||
width: frame.width(),
|
||||
height: frame.height(),
|
||||
scroll_offset,
|
||||
zoom_percent,
|
||||
click_point,
|
||||
typed_text,
|
||||
click_point: None,
|
||||
typed_text: None,
|
||||
#[cfg(all(test, feature = "live-site-smoke"))]
|
||||
non_white_pixel_count,
|
||||
non_white_pixel_count: frame.non_white_pixel_count(),
|
||||
#[cfg(all(test, feature = "live-site-smoke"))]
|
||||
content_pixel_count,
|
||||
content_pixel_count: frame.content_pixel_count(),
|
||||
#[cfg(all(test, feature = "live-site-smoke"))]
|
||||
sample_hash,
|
||||
sample_hash: frame.sample_hash(),
|
||||
rgba_bytes: frame.into_rgba_bytes(),
|
||||
})
|
||||
}
|
||||
|
||||
fn from_parts(parts: WebSurfaceFrameParts) -> Result<Self, WebSurfaceError> {
|
||||
let Some(image_buffer) =
|
||||
ImageBuffer::<Rgba<u8>, _>::from_raw(parts.width, parts.height, parts.rgba_bytes)
|
||||
else {
|
||||
return Err(WebSurfaceError::InvalidFrameBuffer {
|
||||
width: parts.width,
|
||||
height: parts.height,
|
||||
});
|
||||
};
|
||||
|
||||
Ok(Self {
|
||||
requested_url: parts.requested_url,
|
||||
loaded_url: parts.loaded_url,
|
||||
title: parts.title,
|
||||
render_state: parts.render_state,
|
||||
width: parts.width,
|
||||
height: parts.height,
|
||||
scroll_offset: parts.scroll_offset,
|
||||
zoom_percent: parts.zoom_percent,
|
||||
click_point: parts.click_point,
|
||||
typed_text: parts.typed_text,
|
||||
#[cfg(all(test, feature = "live-site-smoke"))]
|
||||
non_white_pixel_count: parts.non_white_pixel_count,
|
||||
#[cfg(all(test, feature = "live-site-smoke"))]
|
||||
content_pixel_count: parts.content_pixel_count,
|
||||
#[cfg(all(test, feature = "live-site-smoke"))]
|
||||
sample_hash: parts.sample_hash,
|
||||
image: Arc::new(RenderImage::new([image::Frame::new(image_buffer)])),
|
||||
})
|
||||
}
|
||||
|
||||
#[cfg(all(test, feature = "live-site-smoke"))]
|
||||
pub(super) fn title_label(&self) -> String {
|
||||
self.title.clone().unwrap_or_else(|| self.requested_url.clone())
|
||||
}
|
||||
|
||||
#[cfg(all(test, feature = "live-site-smoke"))]
|
||||
pub(super) fn url_label(&self) -> &str {
|
||||
self.loaded_url.as_deref().unwrap_or(self.requested_url.as_str())
|
||||
}
|
||||
|
||||
#[cfg(all(test, feature = "live-site-smoke"))]
|
||||
pub(super) fn detail_label(&self) -> String {
|
||||
let mut detail =
|
||||
format!("{} {}", self.render_state(), self.scroll_offset.detail_label(self.size()));
|
||||
@@ -104,14 +117,17 @@ impl WebSurfaceFrame {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(all(test, feature = "live-site-smoke"))]
|
||||
pub(super) fn size(&self) -> WebSurfaceSize {
|
||||
WebSurfaceSize { width: self.width, height: self.height }
|
||||
}
|
||||
|
||||
#[cfg(all(test, feature = "live-site-smoke"))]
|
||||
pub(super) fn render_state(&self) -> &str {
|
||||
self.render_state.as_str()
|
||||
}
|
||||
|
||||
#[cfg(all(test, feature = "live-site-smoke"))]
|
||||
pub(super) fn scroll_offset(&self) -> WebSurfaceScrollOffset {
|
||||
self.scroll_offset
|
||||
}
|
||||
@@ -120,10 +136,12 @@ impl WebSurfaceFrame {
|
||||
self.zoom_percent
|
||||
}
|
||||
|
||||
#[cfg(all(test, feature = "live-site-smoke"))]
|
||||
pub(super) fn click_point(&self) -> Option<WebSurfaceClickPoint> {
|
||||
self.click_point
|
||||
}
|
||||
|
||||
#[cfg(all(test, feature = "live-site-smoke"))]
|
||||
pub(super) fn typed_text(&self) -> Option<&str> {
|
||||
self.typed_text.as_deref()
|
||||
}
|
||||
@@ -144,6 +162,26 @@ impl WebSurfaceFrame {
|
||||
}
|
||||
}
|
||||
|
||||
struct WebSurfaceFrameParts {
|
||||
requested_url: String,
|
||||
loaded_url: Option<String>,
|
||||
title: Option<String>,
|
||||
render_state: String,
|
||||
width: u32,
|
||||
height: u32,
|
||||
scroll_offset: WebSurfaceScrollOffset,
|
||||
zoom_percent: u16,
|
||||
click_point: Option<WebSurfaceClickPoint>,
|
||||
typed_text: Option<String>,
|
||||
#[cfg(all(test, feature = "live-site-smoke"))]
|
||||
non_white_pixel_count: u64,
|
||||
#[cfg(all(test, feature = "live-site-smoke"))]
|
||||
content_pixel_count: u64,
|
||||
#[cfg(all(test, feature = "live-site-smoke"))]
|
||||
sample_hash: u64,
|
||||
rgba_bytes: Vec<u8>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Error)]
|
||||
pub(super) enum WebSurfaceError {
|
||||
#[error("invalid servo frame buffer for {width}x{height}")]
|
||||
|
||||
Reference in New Issue
Block a user