Poll only visible web surfaces
This commit is contained in:
@@ -74,8 +74,8 @@ impl WebSurfaceStore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn tick(&mut self) -> WebSurfaceTickResult {
|
pub(super) fn tick(&mut self, visible_tab_ids: &[TabId]) -> WebSurfaceTickResult {
|
||||||
let frames = self.runtime.tick();
|
let frames = self.runtime.tick(visible_tab_ids);
|
||||||
let mut result = WebSurfaceTickResult::default();
|
let mut result = WebSurfaceTickResult::default();
|
||||||
|
|
||||||
for frame in frames {
|
for frame in frames {
|
||||||
|
|||||||
@@ -51,7 +51,13 @@ impl ElyShell {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn tick_external_web_surfaces(&mut self) -> bool {
|
pub(super) fn tick_external_web_surfaces(&mut self) -> bool {
|
||||||
let result = self.web_surfaces.tick();
|
let visible_tab_ids = match &self.state {
|
||||||
|
super::ShellState::Ready(core) => {
|
||||||
|
core.visible_content_tab_ids().unwrap_or_else(|_| Vec::new())
|
||||||
|
}
|
||||||
|
super::ShellState::StartupError(_) => Vec::new(),
|
||||||
|
};
|
||||||
|
let result = self.web_surfaces.tick(&visible_tab_ids);
|
||||||
let mut url_changed = false;
|
let mut url_changed = false;
|
||||||
for url_change in result.url_changes {
|
for url_change in result.url_changes {
|
||||||
url_changed |= self.apply_web_surface_url_change(url_change);
|
url_changed |= self.apply_web_surface_url_change(url_change);
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ fn wait_for_ready_frame(
|
|||||||
return Err(format!("timed out rendering {}", case.url));
|
return Err(format!("timed out rendering {}", case.url));
|
||||||
}
|
}
|
||||||
|
|
||||||
store.tick();
|
store.tick(std::slice::from_ref(tab_id));
|
||||||
match store.state(tab_id) {
|
match store.state(tab_id) {
|
||||||
Some(WebSurfaceState::Ready(frame)) => {
|
Some(WebSurfaceState::Ready(frame)) => {
|
||||||
validate_prd_frame(frame, case)?;
|
validate_prd_frame(frame, case)?;
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ impl WebSurfaceRuntime {
|
|||||||
Ok(WebSurfaceEnsureResult { requested_url, started_loading, frame, url_change })
|
Ok(WebSurfaceEnsureResult { requested_url, started_loading, frame, url_change })
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn tick(&mut self) -> Vec<WebSurfaceRuntimeFrame> {
|
pub(super) fn tick(&mut self, visible_tab_ids: &[TabId]) -> Vec<WebSurfaceRuntimeFrame> {
|
||||||
let (state, sessions) = (&mut self.state, &mut self.sessions);
|
let (state, sessions) = (&mut self.state, &mut self.sessions);
|
||||||
let RuntimeState::Ready { client, .. } = state else {
|
let RuntimeState::Ready { client, .. } = state else {
|
||||||
return Vec::new();
|
return Vec::new();
|
||||||
@@ -109,6 +109,9 @@ impl WebSurfaceRuntime {
|
|||||||
|
|
||||||
let mut frames = Vec::new();
|
let mut frames = Vec::new();
|
||||||
for (tab_id, session) in sessions {
|
for (tab_id, session) in sessions {
|
||||||
|
if !visible_tab_ids.iter().any(|visible_tab_id| visible_tab_id == tab_id) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
match client.poll(tab_id.as_str().to_string()) {
|
match client.poll(tab_id.as_str().to_string()) {
|
||||||
Ok(Some(frame)) => match WebSurfaceFrame::from_live_frame(
|
Ok(Some(frame)) => match WebSurfaceFrame::from_live_frame(
|
||||||
session.requested_url.clone(),
|
session.requested_url.clone(),
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ mod tab_lifecycle;
|
|||||||
mod tab_order;
|
mod tab_order;
|
||||||
mod tab_selection;
|
mod tab_selection;
|
||||||
mod tabs;
|
mod tabs;
|
||||||
|
mod visible_content;
|
||||||
|
|
||||||
pub use bookmarks::{
|
pub use bookmarks::{
|
||||||
BookmarkImportSummary, ELYBOOKMARKS_FILE_EXTENSION, ELYBOOKMARKS_SCHEMA_VERSION,
|
BookmarkImportSummary, ELYBOOKMARKS_FILE_EXTENSION, ELYBOOKMARKS_SCHEMA_VERSION,
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
use ely_domain::TabId;
|
||||||
|
|
||||||
|
use super::BrowserCore;
|
||||||
|
use crate::CoreError;
|
||||||
|
|
||||||
|
impl BrowserCore {
|
||||||
|
pub fn visible_content_tab_ids(&self) -> Result<Vec<TabId>, CoreError> {
|
||||||
|
let active_tab = self.active_tab()?;
|
||||||
|
let Some(split_id) = active_tab.split_id() else {
|
||||||
|
return Ok(vec![active_tab.id().clone()]);
|
||||||
|
};
|
||||||
|
let layout = self
|
||||||
|
.split_layouts
|
||||||
|
.iter()
|
||||||
|
.find(|layout| layout.id() == split_id)
|
||||||
|
.ok_or_else(|| CoreError::SplitNotFound { id: split_id.clone() })?;
|
||||||
|
if layout.pane_count() < 2 {
|
||||||
|
return Ok(vec![active_tab.id().clone()]);
|
||||||
|
}
|
||||||
|
Ok(layout.panes().iter().map(|pane| pane.tab_id().clone()).collect())
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -25,6 +25,31 @@ fn split_right_creates_two_pane_layout() -> Result<(), Box<dyn Error>> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn visible_content_tab_ids_returns_active_tab_without_split() -> Result<(), Box<dyn Error>> {
|
||||||
|
let core = BrowserCore::new(InitialBrowserConfig::ely_defaults()?)?;
|
||||||
|
let active_tab_id = core.active_tab()?.id().clone();
|
||||||
|
|
||||||
|
assert_eq!(core.visible_content_tab_ids()?, vec![active_tab_id]);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn visible_content_tab_ids_returns_split_panes() -> Result<(), Box<dyn Error>> {
|
||||||
|
let mut core = BrowserCore::new(InitialBrowserConfig::ely_defaults()?)?;
|
||||||
|
let split_id = core.split_active_tab_right()?;
|
||||||
|
let snapshot = core.snapshot()?;
|
||||||
|
let layout = snapshot
|
||||||
|
.split_layouts
|
||||||
|
.iter()
|
||||||
|
.find(|layout| layout.id() == &split_id)
|
||||||
|
.ok_or("missing split layout")?;
|
||||||
|
let pane_ids = layout.panes().iter().map(|pane| pane.tab_id().clone()).collect::<Vec<_>>();
|
||||||
|
|
||||||
|
assert_eq!(core.visible_content_tab_ids()?, pane_ids);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn split_right_command_focuses_new_pane() -> Result<(), Box<dyn Error>> {
|
fn split_right_command_focuses_new_pane() -> Result<(), Box<dyn Error>> {
|
||||||
let mut core = BrowserCore::new(InitialBrowserConfig::ely_defaults()?)?;
|
let mut core = BrowserCore::new(InitialBrowserConfig::ely_defaults()?)?;
|
||||||
|
|||||||
Reference in New Issue
Block a user