Update Servo::get_events to return drain type (#31181)

* Update Servo::get_events to return drain type to prevent constant allocation

* Remove type alias for tlwc

* Fix libsimpleservo
This commit is contained in:
Ngo Iok Ui (Wu Yu Wei) 2024-01-26 19:25:12 +09:00 committed by GitHub
parent 21dbf0ad3a
commit 266a082206
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 23 additions and 12 deletions

View file

@ -40,7 +40,7 @@ pub use servo::webrender_api::units::DeviceIntRect;
use servo::webrender_api::units::DevicePixel;
use servo::webrender_api::ScrollLocation;
use servo::webrender_surfman::WebrenderSurfman;
use servo::{self, gl, BrowserId, Servo};
use servo::{self, gl, Servo, TopLevelBrowsingContextId};
use servo_media::player::context as MediaPlayerContext;
use surfman::{Connection, SurfaceType};
@ -336,7 +336,7 @@ pub fn deinit() {
}
impl ServoGlue {
fn get_browser_id(&self) -> Result<BrowserId, &'static str> {
fn get_browser_id(&self) -> Result<TopLevelBrowsingContextId, &'static str> {
let webview_id = match self.focused_webview_id {
Some(id) => id,
None => return Err("No focused WebViewId yet."),
@ -646,6 +646,8 @@ impl ServoGlue {
}
fn handle_servo_events(&mut self) -> Result<(), &'static str> {
let mut need_update = false;
let mut need_present = false;
for (browser_id, event) in self.servo.get_events() {
match event {
EmbedderMsg::ChangePageTitle(title) => {
@ -660,7 +662,7 @@ impl ServoGlue {
let window_event =
EmbedderEvent::AllowNavigationResponse(pipeline_id, data);
self.events.push(window_event);
let _ = self.perform_updates();
need_update = true;
}
},
EmbedderMsg::HistoryChanged(entries, current) => {
@ -824,7 +826,7 @@ impl ServoGlue {
self.callbacks.host_callbacks.on_panic(reason, backtrace);
},
EmbedderMsg::ReadyToPresent => {
self.servo.present();
need_present = true;
},
EmbedderMsg::Status(..) |
EmbedderMsg::SelectFiles(..) |
@ -839,6 +841,13 @@ impl ServoGlue {
EmbedderMsg::EventDelivered(..) => {},
}
}
if need_update {
let _ = self.perform_updates();
}
if need_present {
self.servo.present();
}
Ok(())
}
}

View file

@ -462,7 +462,7 @@ impl App {
// Take any new embedder messages from Servo itself.
embedder_messages = self.servo.as_mut().unwrap().get_events();
if embedder_messages.is_empty() {
if embedder_messages.len() == 0 {
break;
}
}

View file

@ -7,6 +7,7 @@ use std::fs::File;
use std::io::Write;
use std::rc::Rc;
use std::time::Duration;
use std::vec::Drain;
use std::{env, thread};
use arboard::Clipboard;
@ -292,7 +293,7 @@ where
/// Returns true if the caller needs to manually present a new frame.
pub fn handle_servo_events(
&mut self,
events: Vec<(Option<WebViewId>, EmbedderMsg)>,
events: Drain<'_, (Option<WebViewId>, EmbedderMsg)>,
) -> ServoEventResponse {
let mut need_present = false;
let mut history_changed = false;