From 7c1e5918a8a5eb1f0bad88b42fdc5265ce1b2d2e Mon Sep 17 00:00:00 2001 From: atbrakhi Date: Wed, 23 Apr 2025 14:36:59 +0200 Subject: [PATCH] DevTools: Add `resource_available` as a common shared util (#36632) These PR adds `resource_available` as a common shared util - [x] ./mach build -d does not report any errors - [x] ./mach test-tidy does not report any errors - [x] These changes partially implement https://github.com/servo/servo/issues/36027 --------- Signed-off-by: atbrakhi --- .../devtools/actors/browsing_context.rs | 39 +++++------------ components/devtools/actors/console.rs | 1 + components/devtools/actors/watcher.rs | 1 + components/devtools/actors/worker.rs | 11 +++++ components/devtools/lib.rs | 2 + components/devtools/resource.rs | 42 +++++++++++++++++++ 6 files changed, 68 insertions(+), 28 deletions(-) create mode 100644 components/devtools/resource.rs diff --git a/components/devtools/actors/browsing_context.rs b/components/devtools/actors/browsing_context.rs index c4ead7272bd..5de0855df4a 100644 --- a/components/devtools/actors/browsing_context.rs +++ b/components/devtools/actors/browsing_context.rs @@ -31,6 +31,7 @@ use crate::actors::thread::ThreadActor; use crate::actors::watcher::{SessionContext, SessionContextType, WatcherActor}; use crate::id::{DevtoolsBrowserId, DevtoolsBrowsingContextId, DevtoolsOuterWindowId, IdMap}; use crate::protocol::JsonPacketStream; +use crate::resource::ResourceAvailable; use crate::{EmptyReplyMsg, StreamId}; #[derive(Serialize)] @@ -56,14 +57,6 @@ struct FrameUpdateMsg { title: String, } -#[derive(Serialize)] -struct ResourceAvailableReply { - from: String, - #[serde(rename = "type")] - type_: String, - array: Vec<(String, Vec)>, -} - #[derive(Serialize)] struct TabNavigated { from: String, @@ -152,6 +145,16 @@ pub(crate) struct BrowsingContextActor { pub watcher: String, } +impl ResourceAvailable for BrowsingContextActor { + fn actor_name(&self) -> String { + self.name.clone() + } + + fn get_streams(&self) -> &RefCell> { + &self.streams + } +} + impl Actor for BrowsingContextActor { fn name(&self) -> String { self.name.clone() @@ -358,26 +361,6 @@ impl BrowsingContextActor { }); } - pub(crate) fn resource_available(&self, resource: T, resource_type: String) { - self.resources_available(vec![resource], resource_type); - } - - pub(crate) fn resources_available( - &self, - resources: Vec, - resource_type: String, - ) { - let msg = ResourceAvailableReply:: { - from: self.name(), - type_: "resources-available-array".into(), - array: vec![(resource_type, resources)], - }; - - for stream in self.streams.borrow_mut().values_mut() { - let _ = stream.write_json_packet(&msg); - } - } - pub fn simulate_color_scheme(&self, theme: Theme) -> Result<(), ()> { self.script_chan .send(SimulateColorScheme(self.active_pipeline_id.get(), theme)) diff --git a/components/devtools/actors/console.rs b/components/devtools/actors/console.rs index ecd718e47d4..3897ffa0fce 100644 --- a/components/devtools/actors/console.rs +++ b/components/devtools/actors/console.rs @@ -30,6 +30,7 @@ use crate::actors::browsing_context::BrowsingContextActor; use crate::actors::object::ObjectActor; use crate::actors::worker::WorkerActor; use crate::protocol::JsonPacketStream; +use crate::resource::ResourceAvailable; use crate::{StreamId, UniqueId}; trait EncodableConsoleMessage { diff --git a/components/devtools/actors/watcher.rs b/components/devtools/actors/watcher.rs index 77f82c1023a..d48374fc523 100644 --- a/components/devtools/actors/watcher.rs +++ b/components/devtools/actors/watcher.rs @@ -29,6 +29,7 @@ use crate::actors::watcher::thread_configuration::{ ThreadConfigurationActor, ThreadConfigurationActorMsg, }; use crate::protocol::JsonPacketStream; +use crate::resource::ResourceAvailable; use crate::{EmptyReplyMsg, StreamId}; pub mod network_parent; diff --git a/components/devtools/actors/worker.rs b/components/devtools/actors/worker.rs index 046befe9dc9..42c9d9a9c28 100644 --- a/components/devtools/actors/worker.rs +++ b/components/devtools/actors/worker.rs @@ -17,6 +17,7 @@ use servo_url::ServoUrl; use crate::StreamId; use crate::actor::{Actor, ActorMessageStatus, ActorRegistry}; use crate::protocol::JsonPacketStream; +use crate::resource::ResourceAvailable; #[derive(Clone, Copy)] #[allow(dead_code)] @@ -53,6 +54,16 @@ impl WorkerActor { } } +impl ResourceAvailable for WorkerActor { + fn actor_name(&self) -> String { + self.name.clone() + } + + fn get_streams(&self) -> &RefCell> { + &self.streams + } +} + impl Actor for WorkerActor { fn name(&self) -> String { self.name.clone() diff --git a/components/devtools/lib.rs b/components/devtools/lib.rs index 74b028d5655..d4c3095b025 100644 --- a/components/devtools/lib.rs +++ b/components/devtools/lib.rs @@ -30,6 +30,7 @@ use devtools_traits::{ use embedder_traits::{AllowOrDeny, EmbedderMsg, EmbedderProxy}; use ipc_channel::ipc::{self, IpcSender}; use log::trace; +use resource::ResourceAvailable; use serde::Serialize; use servo_rand::RngCore; @@ -75,6 +76,7 @@ mod actors { mod id; mod network_handler; mod protocol; +mod resource; #[derive(Clone, Debug, Eq, Hash, PartialEq)] enum UniqueId { diff --git a/components/devtools/resource.rs b/components/devtools/resource.rs new file mode 100644 index 00000000000..7cef8188cc8 --- /dev/null +++ b/components/devtools/resource.rs @@ -0,0 +1,42 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +use std::cell::RefCell; +use std::collections::HashMap; +use std::net::TcpStream; + +use serde::Serialize; + +use crate::StreamId; +use crate::protocol::JsonPacketStream; + +#[derive(Serialize)] +pub(crate) struct ResourceAvailableReply { + pub from: String, + #[serde(rename = "type")] + pub type_: String, + pub array: Vec<(String, Vec)>, +} + +pub(crate) trait ResourceAvailable { + fn actor_name(&self) -> String; + + fn get_streams(&self) -> &RefCell>; + + fn resource_available(&self, resource: T, resource_type: String) { + self.resources_available(vec![resource], resource_type); + } + + fn resources_available(&self, resources: Vec, resource_type: String) { + let msg = ResourceAvailableReply:: { + from: self.actor_name(), + type_: "resources-available-array".into(), + array: vec![(resource_type, resources)], + }; + + for stream in self.get_streams().borrow_mut().values_mut() { + let _ = stream.write_json_packet(&msg); + } + } +}