pub struct BaoRuntime { /* private fields */ }Implementations§
Source§impl BaoRuntime
impl BaoRuntime
pub fn new(config: BaoConfig) -> Result<Self, BrowserError>
pub fn page_pool(&self) -> &Rc<PagePool>
pub fn create_page( &self, config: &PageConfig, ) -> Result<PageHandle, BrowserError>
Sourcepub fn create_worker(
&self,
page: &PageHandle,
script: &str,
) -> Result<WorkerHandle, BrowserError>
pub fn create_worker( &self, page: &PageHandle, script: &str, ) -> Result<WorkerHandle, BrowserError>
Create a Dedicated Worker bridged to a page’s servo Realm.
This is the primary entry point for the Worker constructor bridging Create a Dedicated Worker via servo’s native Worker::Constructor.
Per DEC-WK-001 (BCE-20260627-008), bao no longer spawns a
bao_engine::WebWorker bypass thread. Instead, this method dispatches
new Worker(url) into the page via servo’s DOM binding, and servo
constructs the Worker thread + DedicatedWorkerGlobalScope internally.
bao’s role is reduced to:
- Steering stealth profile + DedicatedWorkerGlobalScope Web APIs by
registering the scope callback via
register_worker_scope_callback_native(invoked at page-init time, seeinject_all_with_profile). The callback runs on the Worker thread via the servo vendor patchdrain_worker_scope_callbacks. - Tracking the WorkerHandle for CDP observability + page-unload termination (criterion #10, AutoCloseWorker).
- Providing a WorkerChannelBridge for page↔worker postMessage (criterion #6, DF-WK-4/5) so the bao side can still observe structured-clone traffic even though the thread is servo-owned.
The script argument is treated as a Worker script URL. For inline
scripts, callers should materialize a data:/blob: URL and pass it
here (or call create_worker_with_url).
@trace DEC-WK-001 servo-native Worker path (bypass removed) @trace REQ-BRW-004 [entity:Worker] [criterion:1..10] [criterion:12..18] @trace REQ-BRW-4 [criterion:C1..C4]
Sourcepub fn create_worker_with_url(
&self,
page: &PageHandle,
url: &str,
) -> Result<WorkerHandle, BrowserError>
pub fn create_worker_with_url( &self, page: &PageHandle, url: &str, ) -> Result<WorkerHandle, BrowserError>
Create a Dedicated Worker with a script URL resolved by servo’s native script loading pipeline.
Per DEC-WK-001 (BCE-20260627-008) the bypass bao_engine::WebWorker
path is removed. The Worker is constructed by servo’s DOM
Worker::Constructor when new Worker(url) is evaluated in the page.
This method:
- Builds the WorkerId + WorkerHandle (closing/terminated flags + REALM_PROFILES global_addr_slot, criterion #18).
- Wires up the WorkerChannelBridge (criterion #6, DF-WK-4/5).
- Registers DedicatedWorkerGlobalScope state for CDP observability (criteria #8, #12-17 stealth consistency).
- Tracks the Worker with AutoCloseWorker (criterion #10).
- Dispatches
new Worker(url)into the page via servo’s DOM binding.
@trace DEC-WK-001 servo-native Worker path (bypass removed) @trace REQ-BRW-004 [entity:Worker] [DF-WK-2] @trace REQ-BRW-4 [criterion:C1..C4]
pub fn spin_event_loop(&self)
Sourcepub fn set_console_log_channel(&self, tx: Sender<ConsoleMessage>)
pub fn set_console_log_channel(&self, tx: Sender<ConsoleMessage>)
Set the console log forwarding channel on the servo delegate. Console messages from servo will be sent to this channel.
Sourcepub fn set_event_channel(&self, tx: Sender<ServoEvent>)
pub fn set_event_channel(&self, tx: Sender<ServoEvent>)
Set the structured event forwarding channel on the servo delegate. When set, servo callbacks push ServoEvent (Path B) as the primary event path. @trace REQ-CDP-006 [entity:ServoDelegateHooks]
pub fn run(&self) -> Result<(), BrowserError>
Sourcepub fn pump_cdp(&self, duration: Duration)
pub fn pump_cdp(&self, duration: Duration)
Bounded single-thread CDP pump: spin the servo loop and drain the
memory:// CDP bridge for duration. This is the single-threaded
consumer contract for in-process CDP — the BaoRuntime is !Send
(per-thread JSContext model), so the runtime thread pumps while a
helper thread holds the Browser client whose dispatches arrive
through the bridge channel this drain answers.
BaoRuntime::run is the unbounded version (it also drains).
Sourcepub fn run_with_bridge(
&self,
bridge_rx: BridgeReceiver,
servo_event_rx: Receiver<ServoEvent>,
broadcaster: Arc<EventBroadcaster>,
) -> Result<(), BrowserError>
pub fn run_with_bridge( &self, bridge_rx: BridgeReceiver, servo_event_rx: Receiver<ServoEvent>, broadcaster: Arc<EventBroadcaster>, ) -> Result<(), BrowserError>
Run with a CDP bridge that processes commands during the event loop. Also drains ServoEvent from the EventSubscriber path (Path B) and broadcasts translated CdpEvents via the shared EventBroadcaster. @trace REQ-CDP-006 [entity:ServoDelegateHooks]
Trait Implementations§
Source§impl Drop for BaoRuntime
impl Drop for BaoRuntime
Auto Trait Implementations§
impl !RefUnwindSafe for BaoRuntime
impl !Send for BaoRuntime
impl !Sync for BaoRuntime
impl !UnwindSafe for BaoRuntime
impl Freeze for BaoRuntime
impl Unpin for BaoRuntime
impl UnsafeUnpin for BaoRuntime
Blanket Implementations§
Source§impl<T> AsCtxPtr for Twhere
T: ?Sized,
impl<T> AsCtxPtr for Twhere
T: ?Sized,
Source§fn as_ctx_ptr(&self) -> *mut Selfwhere
Self: Sized,
fn as_ctx_ptr(&self) -> *mut Selfwhere
Self: Sized,
self’s address as *mut Self for deferred-task / scopeguard /
ref_guard ctx slots. The closures/trampolines deref it as shared
(&*p) — every method they reach is &self post-R-2, so no write
provenance is required; the *mut spelling is purely to match the
existing DerefOnDrop / HasAutoFlush / RefCount ABI.Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
impl<T> ErasedDestructor for Twhere
T: 'static,
Source§impl<T> Filterable for T
impl<T> Filterable for T
Source§fn filterable(
self,
filter_name: &'static str,
) -> RequestFilterDataProvider<T, fn(DataRequest<'_>) -> bool>
fn filterable( self, filter_name: &'static str, ) -> RequestFilterDataProvider<T, fn(DataRequest<'_>) -> bool>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more