mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +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
|
@ -11,13 +11,14 @@ use gfx_traits::Epoch;
|
|||
use ipc_channel::ipc::IpcSender;
|
||||
use keyboard_types::KeyboardEvent;
|
||||
use msg::constellation_msg::{
|
||||
BrowsingContextId, PipelineId, TopLevelBrowsingContextId, TraversalDirection,
|
||||
BrowsingContextId, PipelineId, TopLevelBrowsingContextId, TraversalDirection, WebViewId,
|
||||
};
|
||||
use script_traits::{
|
||||
AnimationTickType, CompositorEvent, GamepadEvent, LogEntry, MediaSessionActionType,
|
||||
WebDriverCommandMsg, WindowSizeData, WindowSizeType,
|
||||
};
|
||||
use servo_url::ServoUrl;
|
||||
use webrender_api::units::DeviceRect;
|
||||
|
||||
/// Messages to the constellation.
|
||||
pub enum ConstellationMsg {
|
||||
|
@ -60,9 +61,17 @@ pub enum ConstellationMsg {
|
|||
CloseWebView(TopLevelBrowsingContextId),
|
||||
/// Panic a top level browsing context.
|
||||
SendError(Option<TopLevelBrowsingContextId>, String),
|
||||
/// Make a top-level browsing context focused.
|
||||
/// Move and/or resize a webview to the given rect.
|
||||
MoveResizeWebView(TopLevelBrowsingContextId, DeviceRect),
|
||||
/// Start painting a webview, and optionally stop painting all others.
|
||||
ShowWebView(TopLevelBrowsingContextId, bool),
|
||||
/// Stop painting a webview.
|
||||
HideWebView(TopLevelBrowsingContextId),
|
||||
/// Start painting a webview on top of all others, and optionally stop painting all others.
|
||||
RaiseWebViewToTop(TopLevelBrowsingContextId, bool),
|
||||
/// Make a webview focused.
|
||||
FocusWebView(TopLevelBrowsingContextId),
|
||||
/// Make none of the top-level browsing contexts focused.
|
||||
/// Make none of the webviews focused.
|
||||
BlurWebView,
|
||||
/// Forward an event to the script task of the given pipeline.
|
||||
ForwardEvent(PipelineId, CompositorEvent),
|
||||
|
@ -80,16 +89,23 @@ pub enum ConstellationMsg {
|
|||
SetWebViewThrottled(TopLevelBrowsingContextId, bool),
|
||||
/// Virtual keyboard was dismissed
|
||||
IMEDismissed,
|
||||
/// Compositing done, but external code needs to present.
|
||||
ReadyToPresent(TopLevelBrowsingContextId),
|
||||
/// Notify the embedder that it needs to present a new frame.
|
||||
ReadyToPresent(Vec<WebViewId>),
|
||||
/// Gamepad state has changed
|
||||
Gamepad(GamepadEvent),
|
||||
}
|
||||
|
||||
impl fmt::Debug for ConstellationMsg {
|
||||
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
||||
write!(formatter, "ConstellationMsg::{}", self.variant_name())
|
||||
}
|
||||
}
|
||||
|
||||
impl ConstellationMsg {
|
||||
/// Return the variant name, for error logging that happens after the message is consumed.
|
||||
pub fn variant_name(&self) -> &'static str {
|
||||
use self::ConstellationMsg::*;
|
||||
let variant = match *self {
|
||||
match *self {
|
||||
Exit => "Exit",
|
||||
GetBrowsingContext(..) => "GetBrowsingContext",
|
||||
GetPipeline(..) => "GetPipeline",
|
||||
|
@ -106,6 +122,10 @@ impl fmt::Debug for ConstellationMsg {
|
|||
LogEntry(..) => "LogEntry",
|
||||
NewWebView(..) => "NewWebView",
|
||||
CloseWebView(..) => "CloseWebView",
|
||||
MoveResizeWebView(..) => "MoveResizeWebView",
|
||||
ShowWebView(..) => "ShowWebView",
|
||||
HideWebView(..) => "HideWebView",
|
||||
RaiseWebViewToTop(..) => "RaiseWebViewToTop",
|
||||
FocusWebView(..) => "FocusWebView",
|
||||
BlurWebView => "BlurWebView",
|
||||
SendError(..) => "SendError",
|
||||
|
@ -120,7 +140,6 @@ impl fmt::Debug for ConstellationMsg {
|
|||
ClearCache => "ClearCache",
|
||||
ReadyToPresent(..) => "ReadyToPresent",
|
||||
Gamepad(..) => "Gamepad",
|
||||
};
|
||||
write!(formatter, "ConstellationMsg::{}", variant)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@ use script_traits::{
|
|||
ScriptToCompositorMsg,
|
||||
};
|
||||
use style_traits::CSSPixel;
|
||||
use webrender_api::units::{DeviceIntPoint, DeviceIntSize};
|
||||
use webrender_api::units::{DeviceIntPoint, DeviceIntSize, DeviceRect};
|
||||
use webrender_api::{self, FontInstanceKey, FontKey, ImageKey};
|
||||
|
||||
/// Sends messages to the compositor.
|
||||
|
@ -73,8 +73,18 @@ pub enum CompositorMsg {
|
|||
ShutdownComplete,
|
||||
/// Alerts the compositor that the given pipeline has changed whether it is running animations.
|
||||
ChangeRunningAnimationsState(PipelineId, AnimationState),
|
||||
/// Replaces the current frame tree, typically called during main frame navigation.
|
||||
SetFrameTree(SendableFrameTree),
|
||||
/// Create or update a webview, given its frame tree.
|
||||
CreateOrUpdateWebView(SendableFrameTree),
|
||||
/// Remove a webview.
|
||||
RemoveWebView(TopLevelBrowsingContextId),
|
||||
/// Move and/or resize a webview to the given rect.
|
||||
MoveResizeWebView(TopLevelBrowsingContextId, DeviceRect),
|
||||
/// Start painting a webview, and optionally stop painting all others.
|
||||
ShowWebView(TopLevelBrowsingContextId, bool),
|
||||
/// Stop painting a webview.
|
||||
HideWebView(TopLevelBrowsingContextId),
|
||||
/// Start painting a webview on top of all others, and optionally stop painting all others.
|
||||
RaiseWebViewToTop(TopLevelBrowsingContextId, bool),
|
||||
/// Script has handled a touch event, and either prevented or allowed default actions.
|
||||
TouchEventProcessed(EventResult),
|
||||
/// Composite to a PNG file and return the Image over a passed channel.
|
||||
|
@ -153,7 +163,12 @@ impl Debug for CompositorMsg {
|
|||
CompositorMsg::ChangeRunningAnimationsState(_, state) => {
|
||||
write!(f, "ChangeRunningAnimationsState({:?})", state)
|
||||
},
|
||||
CompositorMsg::SetFrameTree(..) => write!(f, "SetFrameTree"),
|
||||
CompositorMsg::CreateOrUpdateWebView(..) => write!(f, "CreateOrUpdateWebView"),
|
||||
CompositorMsg::RemoveWebView(..) => write!(f, "RemoveWebView"),
|
||||
CompositorMsg::MoveResizeWebView(..) => write!(f, "MoveResizeWebView"),
|
||||
CompositorMsg::ShowWebView(..) => write!(f, "ShowWebView"),
|
||||
CompositorMsg::HideWebView(..) => write!(f, "HideWebView"),
|
||||
CompositorMsg::RaiseWebViewToTop(..) => write!(f, "RaiseWebViewToTop"),
|
||||
CompositorMsg::TouchEventProcessed(..) => write!(f, "TouchEventProcessed"),
|
||||
CompositorMsg::CreatePng(..) => write!(f, "CreatePng"),
|
||||
CompositorMsg::IsReadyToSaveImageReply(..) => write!(f, "IsReadyToSaveImageReply"),
|
||||
|
|
|
@ -10,7 +10,7 @@ use crossbeam_channel::{Receiver, Sender};
|
|||
use ipc_channel::ipc::IpcSender;
|
||||
use keyboard_types::KeyboardEvent;
|
||||
use log::warn;
|
||||
use msg::constellation_msg::{InputMethodType, PipelineId, TopLevelBrowsingContextId};
|
||||
use msg::constellation_msg::{InputMethodType, PipelineId, TopLevelBrowsingContextId, WebViewId};
|
||||
use num_derive::FromPrimitive;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use servo_url::ServoUrl;
|
||||
|
@ -156,13 +156,13 @@ pub enum EmbedderMsg {
|
|||
AllowNavigationRequest(PipelineId, ServoUrl),
|
||||
/// Whether or not to allow script to open a new tab/browser
|
||||
AllowOpeningWebView(IpcSender<bool>),
|
||||
/// A browser was created
|
||||
/// A webview was created.
|
||||
WebViewOpened(TopLevelBrowsingContextId),
|
||||
/// A browser was destroyed
|
||||
/// A webview was destroyed.
|
||||
WebViewClosed(TopLevelBrowsingContextId),
|
||||
/// A browser gained focus for keyboard events
|
||||
/// A webview gained focus for keyboard events.
|
||||
WebViewFocused(TopLevelBrowsingContextId),
|
||||
/// All browsers lost focus for keyboard events
|
||||
/// All webviews lost focus for keyboard events.
|
||||
WebViewBlurred,
|
||||
/// Wether or not to unload a document
|
||||
AllowUnload(IpcSender<bool>),
|
||||
|
@ -210,8 +210,8 @@ pub enum EmbedderMsg {
|
|||
MediaSessionEvent(MediaSessionEvent),
|
||||
/// Report the status of Devtools Server with a token that can be used to bypass the permission prompt.
|
||||
OnDevtoolsStarted(Result<u16, ()>, String),
|
||||
/// Compositing done, but external code needs to present.
|
||||
ReadyToPresent,
|
||||
/// Notify the embedder that it needs to present a new frame.
|
||||
ReadyToPresent(Vec<WebViewId>),
|
||||
/// The given event was delivered to a pipeline in the given browser.
|
||||
EventDelivered(CompositorEventVariant),
|
||||
}
|
||||
|
@ -261,12 +261,12 @@ impl Debug for EmbedderMsg {
|
|||
EmbedderMsg::WebViewOpened(..) => write!(f, "WebViewOpened"),
|
||||
EmbedderMsg::WebViewClosed(..) => write!(f, "WebViewClosed"),
|
||||
EmbedderMsg::WebViewFocused(..) => write!(f, "WebViewFocused"),
|
||||
EmbedderMsg::WebViewBlurred => write!(f, "WebViewUnfocused"),
|
||||
EmbedderMsg::WebViewBlurred => write!(f, "WebViewBlurred"),
|
||||
EmbedderMsg::ReportProfile(..) => write!(f, "ReportProfile"),
|
||||
EmbedderMsg::MediaSessionEvent(..) => write!(f, "MediaSessionEvent"),
|
||||
EmbedderMsg::OnDevtoolsStarted(..) => write!(f, "OnDevtoolsStarted"),
|
||||
EmbedderMsg::ShowContextMenu(..) => write!(f, "ShowContextMenu"),
|
||||
EmbedderMsg::ReadyToPresent => write!(f, "ReadyToPresent"),
|
||||
EmbedderMsg::ReadyToPresent(..) => write!(f, "ReadyToPresent"),
|
||||
EmbedderMsg::EventDelivered(..) => write!(f, "HitTestedEvent"),
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue