feat(servo): upgrade to latest secure upstream snapshot

This commit is contained in:
2026-07-09 16:00:50 -04:00
parent 12565eabc7
commit 78dc86b18e
10 changed files with 1464 additions and 1436 deletions
+2 -30
View File
@@ -47,9 +47,6 @@ pub struct SoftwareServoHost {
default_surface_size: ServoSurfaceSize,
rendering_context_kind: RenderingContextKind,
webviews: HashMap<WebViewId, HostWebView>,
// Servo 0.1.0 can still run script tasks after a remote page moves away.
// Retain hidden about:blank WebViews until host shutdown releases them together.
retired_webviews: Vec<HostWebView>,
permissions: PermissionStore,
wake_requested: Arc<AtomicBool>,
last_rendered_frame: Option<RenderedFrame>,
@@ -112,27 +109,7 @@ impl SoftwareServoHost {
}
pub fn close_webview(&mut self, webview_id: &WebViewId) -> bool {
let Some(webview) = self.webviews.remove(webview_id) else {
return false;
};
self.retire_webview(webview);
true
}
fn retire_webview(&mut self, webview: HostWebView) {
webview.webview.hide();
if let Ok(blank_url) = Url::parse("about:blank") {
webview.webview.load(blank_url);
}
for _ in 0..32 {
self.servo.spin_event_loop();
if webview.current_url().as_deref() == Some("about:blank")
&& matches!(webview.state(), WebViewState::Complete)
{
break;
}
}
self.retired_webviews.push(webview);
self.webviews.remove(webview_id).is_some()
}
fn new_started(
@@ -155,7 +132,6 @@ impl SoftwareServoHost {
default_surface_size: size,
rendering_context_kind,
webviews: HashMap::new(),
retired_webviews: Vec::new(),
permissions: Rc::new(RefCell::new(HashMap::new())),
wake_requested,
last_rendered_frame: None,
@@ -399,11 +375,7 @@ impl ServoHost for SoftwareServoHost {
impl Drop for SoftwareServoHost {
fn drop(&mut self) {
let webviews = std::mem::take(&mut self.webviews);
for webview in webviews.into_values() {
self.retire_webview(webview);
}
self.retired_webviews.clear();
self.webviews.clear();
self.drain_after_webview_close();
SERVO_RUNTIME_STARTED.store(false, Ordering::Release);
}
+7 -2
View File
@@ -1,7 +1,7 @@
use servo::{
DevicePoint, InputEvent, KeyState, KeyboardEvent, Location, Modifiers, MouseButton,
MouseButtonAction, MouseButtonEvent, MouseMoveEvent, TouchEvent, TouchEventType, TouchId,
WebView, WebViewPoint,
TouchPointerType, WebView, WebViewPoint,
};
use crate::keyboard::key_and_code_for_character;
@@ -30,7 +30,12 @@ pub(super) fn send_touch_tap(webview: &WebView, x: u32, y: u32) {
let point = point(x, y);
let touch_id = TouchId(1);
for event_type in [TouchEventType::Down, TouchEventType::Up] {
webview.notify_input_event(InputEvent::Touch(TouchEvent::new(event_type, touch_id, point)));
webview.notify_input_event(InputEvent::Touch(TouchEvent::new(
event_type,
touch_id,
point,
TouchPointerType::Touch,
)));
}
}
@@ -75,11 +75,13 @@ fn site_permission_feature_for_servo(
servo::PermissionFeature::PersistentStorage => {
Some(SitePermissionFeature::StoragePersistence)
}
servo::PermissionFeature::Push
servo::PermissionFeature::ScreenWakeLock(_)
| servo::PermissionFeature::Push
| servo::PermissionFeature::Midi
| servo::PermissionFeature::Speaker
| servo::PermissionFeature::DeviceInfo
| servo::PermissionFeature::BackgroundSync
| servo::PermissionFeature::Gamepad
| servo::PermissionFeature::Bluetooth => None,
}
}
@@ -90,7 +92,20 @@ mod tests {
use crate::{PermissionDecision, PermissionRequest};
use super::{PermissionStore, set_permission_decision, take_permission_decision};
use super::{
PermissionStore, set_permission_decision, site_permission_feature_for_servo,
take_permission_decision,
};
#[test]
fn keeps_disabled_servo_permissions_out_of_site_settings() {
for feature in [
servo::PermissionFeature::ScreenWakeLock(servo::WakeLockType::Screen),
servo::PermissionFeature::Gamepad,
] {
assert_eq!(site_permission_feature_for_servo(feature), None);
}
}
#[test]
fn allow_once_is_consumed_after_one_matching_origin_request()