mirror of
https://github.com/servo/servo.git
synced 2025-08-06 06:00:15 +01:00
Initial internal support for multiple webviews (#31417)
* Add multiple concurrent top-level browsing contexts Co-authored-by: Delan Azabani <dazabani@igalia.com> * Rename variables and comments There are some variable and comments still use browser as names. This commit renames them to webview. * Update log message from web view to webview * Revert offscreen_framebuffer_id rename * Rename all web view to webview * Cargo fmt * Fix viewport/event/clear coordinates when multiview is disabled * Only deprecate things when multiview is enabled * Update WebViewManger with shown and invisible sets Replace visible_webviews and native_window_is_visible with shown_webviews and invisible_webviews. Add 4 more methods to set them accordingly. The behavior of is_effectively_visible will return true if the wbview is in shown_webviews set but not in invisible_webviews. * Update variant behaviors * Rename WebViewVisibilityChanged to MarkWebViewInvisible * Fix unit test by marking id 3 visible again * Update MarkWebViewInvisible and add UnmarkWebViewInvisible * Update format and doc comments * Clean up doc comments * Address style and naming changes * Rename UpdateWebView to UpdateFrameTreeForWebView * constellation: send frame tree unconditionally over focus and feature * Clarify shown and invisible sets in constellation WebViewManager * Eliminate forward_to_constellation!() * Actually remove the unused macro * Don’t gate compositor changes on multiview feature flag * Update todo in mouse event dispatch * Pass all visible webview ids in a single ReadyToPresent message * Fix compile and lint errors * servoshell: fix gap between minibrowser toolbar and webview * Fix failure in /_mozilla/mozilla/window_resizeTo.html * Fix compile warnings * Remove stray dbg!() * Remove confusing “effectively visible” logic (see #31815, #31816) * Allow embedder to show/hide/raise webviews without ipc * Update root pipeline only when painting order actually changes * Stop gating old focus and SetFrameTree behaviour behind Cargo feature * Use webview_id and WebViewId in webview-related code * Improve logging of webview-related embedder events * Allow webview Show and Raise events to optionally hide all others * Don’t do anything in response to WebViewPaintingOrder * Remove WebViewPaintingOrder, since its payload is unreliable * On MoveResizeWebView, only update root pipeline if rect changed * Rename IOCompositor methods for clarity * compositor: add event tracing; log webview ops even without ipc * Add temporary debug logging * Add more temporary debug logging * Remove temporary logging in compositor * Remove temporary debug logging * Add temporary debug logging, but defer I/O until panic * Capture a backtrace with each crash log entry * Proper error handling without panicking in WebViewManager * Clean up imports in constellation --------- Co-authored-by: Delan Azabani <dazabani@igalia.com> Co-authored-by: Martin Robinson <mrobinson@igalia.com>
This commit is contained in:
parent
18b37e676b
commit
66878fb834
21 changed files with 1142 additions and 434 deletions
|
@ -101,12 +101,12 @@ mod test {
|
|||
|
||||
use msg::constellation_msg::{
|
||||
BrowsingContextId, BrowsingContextIndex, PipelineNamespace, PipelineNamespaceId,
|
||||
TopLevelBrowsingContextId,
|
||||
TopLevelBrowsingContextId, WebViewId,
|
||||
};
|
||||
|
||||
use crate::webview::WebViewManager;
|
||||
|
||||
fn top_level_id(namespace_id: u32, index: u32) -> TopLevelBrowsingContextId {
|
||||
fn id(namespace_id: u32, index: u32) -> WebViewId {
|
||||
TopLevelBrowsingContextId(BrowsingContextId {
|
||||
namespace_id: PipelineNamespaceId(namespace_id),
|
||||
index: BrowsingContextIndex(NonZeroU32::new(index).expect("Incorrect test case")),
|
||||
|
@ -115,7 +115,7 @@ mod test {
|
|||
|
||||
fn webviews_sorted<WebView: Clone>(
|
||||
webviews: &WebViewManager<WebView>,
|
||||
) -> Vec<(TopLevelBrowsingContextId, WebView)> {
|
||||
) -> Vec<(WebViewId, WebView)> {
|
||||
let mut keys = webviews.webviews.keys().collect::<Vec<_>>();
|
||||
keys.sort();
|
||||
keys.iter()
|
||||
|
@ -138,59 +138,59 @@ mod test {
|
|||
let mut webviews = WebViewManager::default();
|
||||
|
||||
// add() adds the webview to the map, but does not focus it.
|
||||
webviews.add(TopLevelBrowsingContextId::new(), 'a');
|
||||
webviews.add(TopLevelBrowsingContextId::new(), 'b');
|
||||
webviews.add(TopLevelBrowsingContextId::new(), 'c');
|
||||
webviews.add(WebViewId::new(), 'a');
|
||||
webviews.add(WebViewId::new(), 'b');
|
||||
webviews.add(WebViewId::new(), 'c');
|
||||
assert_eq!(
|
||||
webviews_sorted(&webviews),
|
||||
vec![
|
||||
(top_level_id(0, 1), 'a'),
|
||||
(top_level_id(0, 2), 'b'),
|
||||
(top_level_id(0, 3), 'c'),
|
||||
]
|
||||
vec![(id(0, 1), 'a'), (id(0, 2), 'b'), (id(0, 3), 'c'),]
|
||||
);
|
||||
assert!(webviews.focus_order.is_empty());
|
||||
assert_eq!(webviews.is_focused, false);
|
||||
|
||||
// focus() makes the given webview the latest in focus order.
|
||||
webviews.focus(top_level_id(0, 2));
|
||||
assert_eq!(webviews.focus_order, vec![top_level_id(0, 2)]);
|
||||
webviews.focus(id(0, 2));
|
||||
assert_eq!(webviews.focus_order, vec![id(0, 2)]);
|
||||
assert_eq!(webviews.is_focused, true);
|
||||
webviews.focus(top_level_id(0, 1));
|
||||
assert_eq!(
|
||||
webviews.focus_order,
|
||||
vec![top_level_id(0, 2), top_level_id(0, 1)]
|
||||
);
|
||||
webviews.focus(id(0, 1));
|
||||
assert_eq!(webviews.focus_order, vec![id(0, 2), id(0, 1)]);
|
||||
assert_eq!(webviews.is_focused, true);
|
||||
webviews.focus(top_level_id(0, 3));
|
||||
assert_eq!(
|
||||
webviews.focus_order,
|
||||
vec![top_level_id(0, 2), top_level_id(0, 1), top_level_id(0, 3)]
|
||||
);
|
||||
webviews.focus(id(0, 3));
|
||||
assert_eq!(webviews.focus_order, vec![id(0, 2), id(0, 1), id(0, 3)]);
|
||||
assert_eq!(webviews.is_focused, true);
|
||||
|
||||
// unfocus() clears the “is focused” flag, but does not touch the focus order.
|
||||
webviews.unfocus();
|
||||
assert_eq!(
|
||||
webviews.focus_order,
|
||||
vec![top_level_id(0, 2), top_level_id(0, 1), top_level_id(0, 3)]
|
||||
);
|
||||
assert_eq!(webviews.focus_order, vec![id(0, 2), id(0, 1), id(0, 3)]);
|
||||
assert_eq!(webviews.is_focused, false);
|
||||
|
||||
// focus() avoids duplicates in focus order, when the given webview has been focused before.
|
||||
webviews.focus(top_level_id(0, 1));
|
||||
assert_eq!(
|
||||
webviews.focus_order,
|
||||
vec![top_level_id(0, 2), top_level_id(0, 3), top_level_id(0, 1)]
|
||||
);
|
||||
webviews.focus(id(0, 1));
|
||||
assert_eq!(webviews.focus_order, vec![id(0, 2), id(0, 3), id(0, 1)]);
|
||||
assert_eq!(webviews.is_focused, true);
|
||||
|
||||
// remove() clears the “is focused” flag iff the given webview was focused.
|
||||
webviews.remove(top_level_id(0, 2));
|
||||
webviews.remove(id(1, 1));
|
||||
assert_eq!(webviews.is_focused, true);
|
||||
webviews.remove(top_level_id(0, 1));
|
||||
webviews.remove(id(1, 2));
|
||||
assert_eq!(webviews.is_focused, true);
|
||||
webviews.remove(id(2, 1));
|
||||
assert_eq!(webviews.is_focused, true);
|
||||
webviews.remove(id(2, 2));
|
||||
assert_eq!(webviews.is_focused, true);
|
||||
webviews.remove(id(2, 3));
|
||||
assert_eq!(webviews.is_focused, true);
|
||||
webviews.remove(id(2, 4));
|
||||
assert_eq!(webviews.is_focused, true);
|
||||
webviews.remove(id(3, 1));
|
||||
assert_eq!(webviews.is_focused, true);
|
||||
webviews.remove(id(4, 1));
|
||||
assert_eq!(webviews.is_focused, true);
|
||||
webviews.remove(id(0, 2));
|
||||
assert_eq!(webviews.is_focused, true);
|
||||
webviews.remove(id(0, 1));
|
||||
assert_eq!(webviews.is_focused, false);
|
||||
webviews.remove(top_level_id(0, 3));
|
||||
webviews.remove(id(0, 3));
|
||||
assert_eq!(webviews.is_focused, false);
|
||||
|
||||
// remove() removes the given webview from both the map and the focus order.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue