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

@ -8,6 +8,8 @@ use std::path::PathBuf;
use std::ptr::NonNull;
use std::rc::Rc;
use constellation_traits::EmbedderToConstellationMessage;
use crossbeam_channel::unbounded;
use dpi::PhysicalSize;
use log::{debug, info, warn};
use ohos_abilitykit_sys::runtime::application_context;
@ -16,6 +18,7 @@ use raw_window_handle::{
DisplayHandle, OhosDisplayHandle, OhosNdkWindowHandle, RawDisplayHandle, RawWindowHandle,
WindowHandle,
};
use servo::ipc_channel::ipc;
use servo::{self, EventLoopWaker, ServoBuilder, WindowRenderingContext, resources};
use xcomponent_sys::OH_NativeXComponent;
@ -191,9 +194,33 @@ pub fn init(
let servo = ServoBuilder::new(rendering_context.clone())
.opts(opts)
.preferences(preferences)
.event_loop_waker(waker)
.event_loop_waker(waker.clone())
.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 when init Servo");
webdriver_server::start_server(
port,
embedder_sender,
waker.clone(),
webdriver_response_receiver,
);
info!("WebDriver server started on port {}", port);
embedder_receiver
});
let app_state = RunningAppState::new(
Some(options.url),
native_values.display_density as f32,
@ -201,6 +228,7 @@ pub fn init(
servo,
window_callbacks,
servoshell_preferences,
webdriver_receiver,
);
Ok(app_state)