Basic webdriver support to servoshell on ohos (#38386)

Adding basic webdriver support to servoshell on ohos and basic
communication between the ohos device and script.

Testing: Manual testing and tracing logs

Signed-off-by: abdelrahman1234567 <abdelrahman.hossameldin.awadalla@huawei.com>
This commit is contained in:
Abdelrahman Hossam 2025-08-12 14:26:53 +08:00 committed by GitHub
parent f5b631e270
commit 2e2bfc6067
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 113 additions and 17 deletions

View file

@ -6,8 +6,11 @@ use std::cell::RefCell;
use std::mem;
use std::rc::Rc;
use constellation_traits::EmbedderToConstellationMessage;
use crossbeam_channel::unbounded;
use dpi::PhysicalSize;
use raw_window_handle::{DisplayHandle, RawDisplayHandle, RawWindowHandle, WindowHandle};
use servo::ipc_channel::ipc;
pub use servo::webrender_api::units::DeviceIntRect;
use servo::{self, EventLoopWaker, ServoBuilder, resources};
pub use servo::{InputMethodType, MediaSessionPlaybackState, WindowRenderingContext};
@ -84,21 +87,43 @@ pub fn init(
let servo_builder = ServoBuilder::new(rendering_context.clone())
.opts(opts)
.preferences(preferences)
.event_loop_waker(waker);
.event_loop_waker(waker.clone());
#[cfg(feature = "webxr")]
let servo_builder = servo_builder.webxr_registry(Box::new(XrDiscoveryWebXrRegistry::new(
init_opts.xr_discovery,
)));
let servo = servo_builder.build();
// Initialize WebDriver server if port is specified
let webdriver_receiver = servoshell_preferences.webdriver_port.map(|port| {
let (embedder_sender, embedder_receiver) = unbounded();
let (webdriver_response_sender, webdriver_response_receiver) = ipc::channel().unwrap();
// Set the WebDriver response sender to constellation
servo
.constellation_sender()
.send(EmbedderToConstellationMessage::SetWebDriverResponseSender(
webdriver_response_sender,
))
.expect("Failed to set WebDriver response sender in constellation");
webdriver_server::start_server(port, embedder_sender, waker, webdriver_response_receiver);
log::info!("WebDriver server started on port {}", port);
embedder_receiver
});
APP.with(|app| {
let app_state = RunningAppState::new(
init_opts.url,
init_opts.density,
rendering_context,
servo_builder.build(),
servo,
window_callbacks,
servoshell_preferences,
webdriver_receiver,
);
*app.borrow_mut() = Some(app_state);
});