servo/components/servo/servo_delegate.rs
Martin Robinson 2fe57cc2a2
libservo: Move animation tracking from WindowMethods to delegates (#36400)
This changes removes animation tracking from the `WindowMethods` trait
and moves it to `ServoDelegate` and `WebViewDelegate`.

- Animation changes per-`WebView` are now triggered in the compositor
  only when the value is updated there, rather than right after ticking
  animations.
- Both `WebView` and `Servo` now expose an `animation()` method, so
  tracking animation state actually becomes unecessary in many cases,
  such as that of desktop servoshell, which can just read the value
  when the event loop spins.

Testing: No tests necessary as the API layer is still untested. Later,
tests will be added for the `WebView` API and this can be tested then.
Signed-off-by: Martin Robinson <mrobinson@igalia.com>

Signed-off-by: Martin Robinson <mrobinson@igalia.com>
2025-04-09 19:41:53 +00:00

50 lines
2.6 KiB
Rust

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use embedder_traits::Notification;
use crate::Servo;
use crate::webview_delegate::{AllowOrDenyRequest, WebResourceLoad};
#[derive(Debug)]
pub enum ServoError {
/// The channel to the off-the-main-thread web engine has been lost. No further
/// attempts to communicate will happen. This is an unrecoverable error in Servo.
LostConnectionWithBackend,
/// The devtools server, used to expose pages to remote web inspectors has failed
/// to start.
DevtoolsFailedToStart,
/// Failed to send response to delegate request.
ResponseFailedToSend(bincode::Error),
}
pub trait ServoDelegate {
/// Notification that Servo has received a major error.
fn notify_error(&self, _servo: &Servo, _error: ServoError) {}
/// Report that the DevTools server has started on the given `port`. The `token` that
/// be used to bypass the permission prompt from the DevTools client.
fn notify_devtools_server_started(&self, _servo: &Servo, _port: u16, _token: String) {}
/// Request a DevTools connection from a DevTools client. Typically an embedder application
/// will show a permissions prompt when this happens to confirm a connection is allowed.
fn request_devtools_connection(&self, _servo: &Servo, _request: AllowOrDenyRequest) {}
/// Any [`WebView`] in this Servo instance has either started to animate or WebXR is
/// running. When a [`WebView`] is animating, it is up to the embedding application
/// ensure that `Servo::spin_event_loop` is called at regular intervals in order to
/// update the painted contents of the [`WebView`].
fn notify_animating_changed(&self, _animating: bool) {}
/// Triggered when Servo will load a web (HTTP/HTTPS) resource. The load may be
/// intercepted and alternate contents can be loaded by the client by calling
/// [`WebResourceLoad::intercept`]. If not handled, the load will continue as normal.
///
/// Note: This delegate method is called for all resource loads not associated with a
/// [`WebView`]. For loads associated with a [`WebView`], Servo will call
/// [`crate::WebViewDelegate::load_web_resource`].
fn load_web_resource(&self, _load: WebResourceLoad) {}
/// Request to display a notification.
fn show_notification(&self, _notification: Notification) {}
}
pub(crate) struct DefaultServoDelegate;
impl ServoDelegate for DefaultServoDelegate {}